Java 在双大括号初始化中引用自身的对象不能给出NPE吗?
我这里有一段代码,它总是会抛出一个NPE:Java 在双大括号初始化中引用自身的对象不能给出NPE吗?,java,nullpointerexception,ide,static-code-analysis,double-brace-initialize,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) { } } 有没有方法可以在实例初始化块中初始化对象
public class Test1 {
private final static Object OBJECT = new Object() {{
System.out.println("OBJECT.toString() = " + OBJECT.toString());
}};
public static void main(String[] args) { }
}
有没有方法可以在实例初始化块中初始化对象
?或者实例初始化块中对对象的所有可能引用是否总是抛出一个NPE
对于西部最快的枪,请阅读以下内容:不,我不是要你解决我的错误。这是我在某处看到的一段简化代码,令我惊讶的是,它在Eclipse或Netbeans中都没有给出空警告,我希望它给出空警告。只是一个带有实例初始化器的匿名内部类。
因此,适用于创建对象的规则
NPE是一个运行时异常,因此IDE使用启发式方法来查找罪魁祸首,而不是静态类型、声明的异常和静态代码分析提供的严格性和确定性。在这里,它必须执行代码才能发现运行时问题
发生的情况是:
正在通过为静态成员分配匿名内部类来初始化该成员。内部类的构造函数已完成,因为这是实例初始值设定项的规则。但是,只有在初始化器完成后才分配引用,而在您尝试取消引用对象时,初始化器还没有完成
似乎是一种非常循环的解释,但这是因为所发生的是循环引用;) 为什么不能只使用这个
?这是我在某处解决现有问题时发现的一个bug,Eclipse和Netbeans都没有给出空指针警告,您的字段是静态的,对静态字段的任何调用都不必有空检查警告。@Maas为什么静态字段不应该有空检查警告?我的2c(-):从代码分析器的角度来看,此字段是静态的最终字段,并获得分配的内容。如果对象的初始化块使用字段引用,则需要进行一些(广泛的?)分析。我的意思是,如果您要访问它,例如在toString或其他内容中,则该引用仅在构造函数和ini块中为null。