-ea: Java -ea:AssertionClass
启用AssertionClass类的assertion
-da: Java -da:AssertionClass
关闭AssertionClass类的assertion
-ea:
Java -ea:pkg0...
启用pkg0包的assertion
-da:
Java -da:pkg0...
关闭pkg0包的assertion
-esa Java -esa
启用系统类中的assertion
-dsa Java -dsa
关闭系统类中的assertion
至此,我们前面编写的小程序aClass可以用以下的任意命令运行:
java -ea aClass
java -ea:aClass aClass
java -ea:... aClass
运行结果如下:
aClass.aMethod( 1 ): OK
aClass.aMethod( -1 ): java.lang.AssertionError
at aClass.aMethod(aClass.java:3)
at aClass.main(aClass.java:12)
Exception in thread "main"
三、assertion命令行参数之间的继承关系
assertion功能的启用和关闭可以一直控制到每一个类,一个命令行可以容纳任意多个-ea -da 参数,这些参数之间是如何相互起作用的,基本上遵循两个原则:特定具体的设定优先于一般的设定,后面的设定优先于前面的设定。我们看下面的例子:
// Base.java
package tmp;
public class Base{
public void m1( boolean test ){
assert test : "Assertion failed: test is " + test;
System.out.println( "OK" );
}
// Derived.java
//
package tmp.sub;
import tmp.Base;
public class Derived extends Base{
public void m2( boolean test ){
assert test : "Assertion failed: test is " + test;
System.out.println( "OK" );
}
public static void printAssertionError( AssertionError ae ){
StackTraceElement[] stackTraceElements = ae.getStackTrace();
StackTraceElement stackTraceElement = stackTraceElements[ 0 ];
System.err.println( "AssertionError" );
System.err.println( " class= " + stackTraceElement.getClassName() );
System.err.println( " method= " + stackTraceElement.getMethodName() );
System.err.println( " message= " + ae.getMessage() );
}
public static void main( String[] args ){
try{
Derived derived = new Derived();
System.out.print( "derived.m1( false ): " );
derived.m1( false );
System.out.print( "derived.m2( false ): " );
derived.m2( false );
}catch( AssertionError ae ){
printAssertionError( ae );
}
}
}
Base类和Derived类个有一个方法m1和m2,因为Derived是Base的子类,所以它同时继承了方法m1。
首先在启用所有类的assertion功能后,运行程序:
java -ea tmp.sub.Derived
derived.m1( false ): AssertionError
class= tmp.Bas