2017-05-22 20 views
2

如果我激活一类richtercloud.java.assertion.ignored.NewMainmain方法继Oracle documentation为什么当assertion以编程方式激活时,“assert false”不会导致AssertionError?

ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true); 
ClassLoader.getSystemClassLoader().setPackageAssertionStatus("richtercloud.java.assertion.ignored", true); 
System.out.println(String.format("desired assertion status: %b", 
     NewMain.class.desiredAssertionStatus())); 
assert false; 
System.out.println("assertion has been ignored"); 

断言,我从印结看到assert false不会引起AssertionError像它造成的,如果我包在一个JAR NewMain和用java -ea -jar java-assertion-ignored-1.0-SNAPSHOT-jar-with-dependencies.jar richtercloud.java.assertion.ignored.NewMain运行它。

有关程序化启用断言的其他问题only suggest to not use assertions这显然不是解决方案。

MCVE https://github.com/krichter722/java-assertion-ignored

回答

3

如果我正确理解文档,您必须在加载类之前设置断言状态;在这个例子中你已经加载了这个类,所以你的setDefaultAssertionStatus(true)没有效果。

Quoting from the documentation(我的斜体字):

每个类加载器维护一个默认断言状态,决定断言是否在默认情况下一个布尔值,使能或新类残疾人被随后初始化由类加载器提供的

因此,设置默认断言状态只会影响随后加载的类,而不会影响当前正在执行的类。

相关问题