如何在初始化块中使用构造函数参数

时间:2016-05-03 13:39:46

标签: java swing

我正在使用NetBeans IDE进行swings编程

这是一个添加/修改方案,MyFrame1处理MyClass1 obj,MyClass1MyClass2,如果必须添加/编辑MyClass2MyClass1 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
  }
}

据我所知

  1. 初始化块代码被复制到每个构造函数的开头

  2. 初始化初始化块内的字段,字段的声明应出现在初始化块之前。

  3. 然后,当我在初始化块中包含NullPointerException时,为什么我得到this.parent = parent;,如果直接添加到构造函数中,则工作正常?

    初始化块代码是否未复制到构造函数?

3 个答案:

答案 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