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