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

What JVM is doing internally when it encounters an assert statement in java program?

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

assertion proposal解释:

The assert statement [is] merely syntactic sugar for this if statement:

if ($assertionsEnabled && !(Expression1))
    throw new AssertionError(Expression2);

$assertionsEnabled 是一个由编译器添加的合成布尔字段。

感谢 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:>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 {};
}