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的其他问题,这显然不是解决方案。
答案 0 :(得分:4)
如果我正确理解文档,则必须在加载类之前设置断言状态;在此示例中,您已经加载了该类,因此setDefaultAssertionStatus(true)
无效。
Quoting from the documentation(我的斜体):
每个类加载器都维护一个默认断言状态,这是一个布尔值,用于确定默认情况下,断言是否在随后初始化的新类中启用或禁用。类加载器。
因此,设置默认断言状态只会影响后续加载的类,而不会影响当前正在执行的类。