【问题标题】:Why is "assert false" not causing AssertionError when assertion are activated programmatically?当以编程方式激活断言时,为什么“断言错误”不会导致 AssertionError?
【发布时间】:2023-03-06 04:45:01
【问题描述】:

如果我在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");

richtercloud.java.assertion.ignored.NewMain 类的main 方法中,我从打印的语句中看到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 的其他问题,这显然不是解决方案。

【问题讨论】:

    标签: java assertion


    【解决方案1】:

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

    Quoting from the documentation(我的斜体):

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      • 2021-12-11
      • 2017-03-16
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多