为什么"断言错误"以编程方式激活断言时不会导致AssertionError?

时间:2017-05-22 23:58:43

标签: java assertions

如果我在Oracle documentation

之后激活断言
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");

在课程main的{​​{1}}方法中,我从打印的声明中看到,richtercloud.java.assertion.ignored.NewMain并未导致assert false类似于AssertionError如果我将NewMain打包到JAR中并使用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

1 个答案:

答案 0 :(得分:4)

如果我正确理解文档,则必须在加载类之前设置断言状态;在此示例中,您已经加载了该类,因此setDefaultAssertionStatus(true)无效。

Quoting from the documentation(我的斜体):

  

每个类加载器都维护一个默认断言状态,这是一个布尔值,用于确定默认情况下,断言是否在随后初始化的新类中启用或禁用。类加载器。

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