1

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

4

1 回答 1

2

双括号初始化只是一个带有实例初始化器的匿名内部类。因此,适用于创建对象的规则。

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

正在发生的事情是这样的:通过分配给它的匿名内部类来初始化一个静态成员。内部类的构造函数已经完成,因为这是实例初始化器的规则。但是,仅在初始化程序完成后才分配引用,而在您尝试取消引用时它们还没有完成OBJECT

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

于 2014-08-20T09:58:12.393 回答