java - 在双括号初始化中引用自身的对象能否给出 NPE?

标签 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) { }
}

有没有办法可以在实例初始化 block 中初始化OBJECT?或者实例初始化 block 中对 OBJECT 的每个可能的引用总是抛出 NPE?

对于那些西方最快的枪,请阅读以下内容:不,我不是要求你解决我的错误。这是我在某处看到的一段简化代码,令我惊讶的是,它在 Eclipse 或 Netbeans 中都没有给出空警告,而我希望它会给出空警告。

最佳答案

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

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

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

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

关于java - 在双括号初始化中引用自身的对象能否给出 NPE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25398651/

相关文章:

以反冲结尾的 Java 属性值

java - 代理实例如何将自身传递给 IncationHandler?

java - 将 List<MyType> 重组为 List<List<MyType>>

Java - 填充 ArrayList 会出现空指针错误

python - 如何在 Spyder 4 中运行选定的线路?

c++ - 向 Java 开发人员的 Eclipse Oxygen IDE 添加 C/C++ 语言

java - 如何解决 Jackson 无法处理 JPA bean 中的直接自引用的问题

java - NullPointerException JApplet 与 getClass().getResource

java - 尝试使用 JavaFX 播放音频文件

intellij-idea - Intellij Idea 无法启动 Windows 10