变量在一行上不为null,在下一行上为null

时间:2014-05-03 19:53:17

标签: java netbeans nullpointerexception

我目前遇到的问题是我正在通过Netbeans IDE用java编写的应用程序。我的代码发布在下面,以及部分错误消息。

   public DietUI(DietCntl theCreatingCntl){
   theDietCntl = theCreatingCntl;

   double calories = DietCntl.getDietCntl().getDiet().theDiet.calories;
   double saturatedFat = DietCntl.getDietCntl().getDiet().theDiet.saturatedFat;
   double polyunsaturatedFat = DietCntl.getDietCntl().getDiet().theDiet.polyunsaturatedFat;
   double transFat = DietCntl.getDietCntl().getDiet().theDiet.transFat;
   double totalFat = DietCntl.getDietCntl().getDiet().theDiet.totalFat;
   double cholesterol = DietCntl.getDietCntl().getDiet().theDiet.cholesterol;
   double sodium = DietCntl.getDietCntl().getDiet().theDiet.sodium;
   double potassium = DietCntl.getDietCntl().getDiet().theDiet.potassium;
   double dietaryFiber = DietCntl.getDietCntl().getDiet().theDiet.dietaryFiber;
   double sugar = DietCntl.getDietCntl().getDiet().theDiet.sugar;
   double totalCarbs = DietCntl.getDietCntl().getDiet().theDiet.totalCarbs;
   double protein = DietCntl.getDietCntl().getDiet().theDiet.protein;
   String name = DietCntl.getDietCntl().getDiet().theDiet.

// System.out.println是第30行,DietUI.this.etc是第31行。

   System.out.println("name in Diet UI: "+name);
   DietUI.this.nameTextField.setText(name);

//我的问题是第31行读为null。 30号线没有。名称将使用正确的值实例化一次,然后在下一个名称中为null。

   DietUI.this.cholesterolTextField.setText(String.valueOf(cholesterol));
   DietUI.this.dietaryFiberTextField.setText(String.valueOf(dietaryFiber));
   DietUI.this.caloriesTextField.setText(String.valueOf(calories));
   DietUI.this.polyunsaturatedFatTextField.setText(String.valueOf(polyunsaturatedFat));
   DietUI.this.transFatTextField.setText(String.valueOf(transFat));
   DietUI.this.potassiumTextField.setText(String.valueOf(potassium));
   DietUI.this.saturatedFatTextField.setText(String.valueOf(saturatedFat));
   DietUI.this.sodiumTextField.setText(String.valueOf(sodium));
   DietUI.this.proteinTextField.setText(String.valueOf(protein));
   DietUI.this.sugarTextField.setText(String.valueOf(sugar));
   DietUI.this.totalCarbsTextField.setText(String.valueOf(totalCarbs));
   DietUI.this.totalFatTextField.setText(String.valueOf(totalFat));

}

//下面是输出。它包含System.out.println(“Diet UI中的名称:”+名称);以及错误消息的一部分。

name in Diet UI: Name Empty

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at healthbuddy.DietUI.<init>(DietUI.java:31)
at healthbuddy.DietCntl.<init>(DietCntl.java:21)
at healthbuddy.MainMenuCntl.getDietPlannerCntl(MainMenuCntl.java:39)
at healthbuddy.MainMenuUI$DietPlannerButtonListener.actionPerformed(MainMenuUI.java:79)

// DietCntl类,仅包括incase。

public class DietCntl {
public static DietCntl theDietCntl;
private Diet theDiet;
public DietCntl(){

}
public DietCntl(int a){
    DietUI theDietUI = new DietUI(this);
}
public static DietCntl getDietCntl(){
    if(theDietCntl == null){
        theDietCntl = new DietCntl();
    }
    return theDietCntl;
}

public Diet getDiet(){
    if(theDiet == null){
        theDiet = new Diet();
    }
    return theDiet;
}

public void getMainMenuCntl(){
    MainMenuCntl theMMCntl = new MainMenuCntl();

} }

目前我的Diet对象设置如果Diet对象是使用默认构造函数创建的,则Diet的name属性将设置为“Name Empty”。目前DietUI的构造函数从Diet中提取值并将它们放在变量中。然后将这些变量的值放在textField中供用户编辑。

在DietUI第31行中,我从Diet类中读取的name属性显然是null,但是在它正上方的行中它显示为我期望通过System.out.println();的值。我很难过这个。我不明白当下一行代码没有改变它的值时变量如何变为null。我也包括了我的DietCntl课程,只是因为那里有一些东西给了我这个问题。

非常感谢任何帮助。在一周的大部分时间里都在努力解决这个问题。

编辑:我有点白痴。我的所有GUI元素都设置为在initComponents方法中初始化,但我从不在构造函数中调用该方法。谢谢你stackoverflow。

1 个答案:

答案 0 :(得分:3)

此代码:

System.out.println("name in Diet UI: "+name);
DietUI.this.nameTextField.setText(name);

不按照你的想法行事。

第一行显示name变量不为null,但是,这不是导致NullPointerException的原因。问题是null为nameTextField而不是名称String。您可能没有初始化任何GUI组件。

例如,如果这是Swing,你必须这样做:

// this must be done first
JTextField nameTextField = new JTextField();

// before you can set its text property like so:
nameTextField.setText(name);

修改
您在评论中说明:

  

我相信我已经这样做了。我使用了Netbeans GUI构建器,因此它为我实例化:nameTextField = new javax.swing.JTextField()

你的JVM似乎在告诉你,但是不要接受我的话,....测试它!尝试:

System.out.println("name in Diet UI: "+name);
System.out.println("is nameTextField null?: " + (nameTextField == null));

告诉我们返回的内容。