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
来运行它。
答案 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