我正在使用NetBeans IDE进行swings编程
这是一个添加/修改方案,MyFrame1
处理MyClass1
obj,MyClass1
有MyClass2
,如果必须添加/编辑MyClass2
在MyClass1
MyFrame1
中启动MyFrame2
我尝试使用以下代码并获得NullPointerException
class MyFrame2 extends JFrame implements ActionListener{
MyFrame1 parent;
MyClass2 obj;
Test(MyFrame1 parent){ // For Add scenario
//this.parent = parent
obj = new MyClass2();
//do something
}
Test(MyFrame1 parent, MyClass2 obj){ // For Edit scenario
//this.parent = parent
this.obj = obj;
//do something
}
//functions
........
private void foo(){
parent.addValues(obj); //throws NullPointerException
}
//some editor managed code and fields
............
{
this.parent = parent;
//other initalizations
}
}
据我所知
初始化块代码被复制到每个构造函数的开头
初始化初始化块内的字段,字段的声明应出现在初始化块之前。
然后,当我在初始化块中包含NullPointerException
时,为什么我得到this.parent = parent;
,如果直接添加到构造函数中,则工作正常?
初始化块代码是否未复制到构造函数?
答案 0 :(得分:0)
您正在使用null初始化父级。
此
{
this.parent = parent;
//other initalizations
}
与
相同 MyFrame1 parent = null;
答案 1 :(得分:0)
您可能在调用任何Test方法之前调用foo方法,此时obj将没有引用(将为null),导致NullPointerException,我可以建议制作“Test”方法构造函数避免这个?无论如何,他们似乎都在为初始化价值提供服务
答案 2 :(得分:0)
您正在调用的初始化块实际上是一个静态初始化块,它在构造函数之前和创建MyFrame2实例之前调用。
在此处了解静态初始化块:https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html