为什么在类初始化之前执行的assert语句的行为就好像在类中启用了断言一样?

时间:2016-10-06 18:34:02

标签: java assert

Change Log4j properties at runtime列出的最后一个问题是:

  

为什么在类初始化之前执行的assert语句的行为就好像在类中启用了断言一样?

     

很少有程序员意识到类的构造函数和方法可以在初始化之前运行。当发生这种情况时,很可能该类的不变量尚未建立,这可能导致严重和微妙的错误。在此状态下执行的任何断言都可能失败,从而向程序员发出警告。因此,程序员执行在此状态下遇到的所有断言通常很有帮助。

然而,当我跑:

public class Main {

    static {
        boolean assertionsEnabled = false;
        assert (assertionsEnabled = true);
        System.out.println("static initializer: " + assertionsEnabled);
    }

    public Main() {
        boolean assertionsEnabled = false;
        assert (assertionsEnabled = true);
        System.out.println("constructor: " + assertionsEnabled);
    }

    public static void main(String[] args) {
        new Main();
    }
}

禁用断言,我得到了输出:

static initializer: false
constructor: false

Oracle在上面的文章中提到了什么?何时意外启用断言?

更新:我不会问为什么我在禁用断言的情况下获得false的值。这是预料之中的。我在问为什么Oracle暗示断言有时会表现得好像是因为我没有使用-ea来运行它。

1 个答案:

答案 0 :(得分:2)

只需打开Java Language Specification

引用:

public class Foo {
    public static void main(String[] args) {
        Baz.testAsserts();
        // Will execute after Baz is initialized.
    }
}
class Bar {
    static {
        Baz.testAsserts();
        // Will execute before Baz is initialized!
    }
}
class Baz extends Bar {
    static void testAsserts() {
        boolean enabled = false;
        assert  enabled = true;
        System.out.println("Asserts " +
                (enabled ? "enabled" : "disabled"));
    }
}

输出:

Asserts enabled
Asserts disabled