我是java中断言概念的新手。 我在哪里读过关于java中的 assert 概念,总是说,如果我们使用 assert expression1:expression2 ,它将使用默认构造函数或七个之一AssertionError类中的构造函数,以防它失败。 但我怀疑的是,当assert语句失败时,谁实际上抛出了这个 AssertionError 错误?编译器是否会添加“ 抛出新的AssertionError( - - ) “或JVM将检查表达式并抛出 AssertionError (如 ArithmeticException , NullPointerException 等......)?
答案 0 :(得分:6)
assertion proposal解释了它:
断言语句[is]仅仅是语法糖 语句:
if ($assertionsEnabled && !(Expression1)) throw new AssertionError(Expression2);
$assertionsEnabled
是一个合成布尔字段,也可以由编译器添加。
答案 1 :(得分:1)
感谢Kapep和David的快速回复。
最后我得到了实际证据:)
<强> Foo.java 强>
package pack1;
public class Foo {
public void m1( int value ) {
assert 0 <= value;
System.out.println( "OK" );
}
public static void main( String[] args ) {
Foo foo = new Foo();
System.out.print( "foo.m1( 1 ): " );
foo.m1( 1 );
System.out.print( "foo.m1( -1 ): " );
foo.m1( -1 );
}
}
当我最后尝试使用javap命令时,我可以看到以下输出与编译器添加的断言相关信息。
C:&gt; javap pack1.Foo
编译自“Foo.java”
public class pack1.Foo {
static final boolean $assertionsDisabled;
public pack1.Foo();
public void m1(int);
public static void main(java.lang.String[]);
static {};
}