我这里有一小段代码,它总是会抛出 NPE:
public class Test1 {
private final static Object OBJECT = new Object() {{
System.out.println("OBJECT.toString() = " + OBJECT.toString());
}};
public static void main(String[] args) { }
}
有没有办法可以在实例初始化 block 中初始化OBJECT
?或者实例初始化 block 中对 OBJECT 的每个可能的引用总是抛出 NPE?
对于那些西方最快的枪,请阅读以下内容:不,我不是要求你解决我的错误。这是我在某处看到的一段简化代码,令我惊讶的是,它在 Eclipse 或 Netbeans 中都没有给出空警告,而我希望它会给出空警告。
最佳答案
Double brace initialisation只是一个带有实例初始化程序的匿名内部类。 因此,管理创建对象的规则适用。
NPE 是一种运行时异常,因此 IDE 使用启发式方法来查找罪魁祸首,而不是静态类型、声明的异常和静态代码分析提供的严格性和确定性。这里必须执行代码才能发现运行时问题。
发生的事情是这样的:
通过分配给匿名内部类来初始化静态成员。内部类的构造函数已完成,因为这是实例初始值设定项的规则。然而,只有在初始化程序完成后才会分配引用,而当您尝试取消引用OBJECT
时,它们还没有分配。
似乎是一个非常循环的解释,但那是因为正在发生的是循环引用;)
关于java - 在双括号初始化中引用自身的对象能否给出 NPE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25398651/