当JVM在java程序中遇到断言语句时,它在内部做什么?

时间:2015-12-31 05:56:55

标签: java assert assertion

我是java中断言概念的新手。 我在哪里读过关于java中的 assert 概念,总是说,如果我们使用 assert expression1:expression2 ,它将使用默认构造函数或七个之一AssertionError类中的构造函数,以防它失败。 但我怀疑的是,当assert语句失败时,谁实际上抛出了这个 AssertionError 错误?编译器是否会添加“ 抛出新的AssertionError( - - ) “或JVM将检查表达式并抛出 AssertionError (如 ArithmeticException NullPointerException 等......)?

2 个答案:

答案 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 {};
}