我目前遇到的问题是我正在通过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。答案 0 :(得分:3)
此代码:
System.out.println("name in Diet UI: "+name);
DietUI.this.nameTextField.setText(name);
不按照你的想法行事。
第一行显示name
变量不为null,但是,这不是导致NullPointerException的原因。问题是null为nameTextField
而不是名称String。您可能没有初始化任何GUI组件。
// 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));
告诉我们返回的内容。