在双支撑初始化中引用自身的对象是否可以不提供NPE?

时间:2014-08-20 07:03:44

标签: java nullpointerexception ide static-code-analysis double-brace-initialize

我这里有一小段代码,它总是会抛出一个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中都没有给出空值警告,我希望它能给出它。

1 个答案:

答案 0 :(得分:2)

Double brace initialisation只是一个带有实例初始化程序的匿名内部类。 因此,适用于创建对象的规则适用。

NPE是一个运行时异常,因此IDE使用启发式方法来查找罪魁祸首,而不是静态类型,声明的异常和静态代码分析所提供的严谨性和确定性。在这里,它必须执行代码才能找到运行时问题。

这是怎么回事: static 成员通过为其分配匿名内部类来初始化。内部类的构造函数已完成,因为这是实例初始化程序的规则。但是,只有在初始化程序完成后才会分配引用,当您尝试取消引用OBJECT时,它们尚未分配。

似乎是一个非常循环的解释,但那是因为正在发生的事情是循环引用;)