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