我目前通过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行读取为空。第30行没有。Name前一刻用正确的值实例化,然后下一刻为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);以及错误消息的一部分。
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类,只是为了以防万一。
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中提取值并将它们放入变量中。然后将这些变量的值放在textFields中供用户编辑。
在DietUI中,第31行,从Diet类读取的my name属性显然是空的,但在它的正上方的行中,它显示为我通过System.out.println();期望的值。我被这个难住了。我不明白当下一行代码没有改变它的值时,变量如何变为null。我也包括了我的DietCntl类,以防有什么东西给我这个问题。
任何帮助都将非常感激。这一周的大部分时间我都在纠结这个问题。
编辑:我有点像个白痴。我所有的GUI元素都在initComponents方法中设置为初始化,但我从未在构造函数中调用该方法。感谢stackoverflow.代码:
System.out.println("name in Diet UI: "+name);
DietUI.this.nameTextField.setText(name);
不像你想象的那样。
第一行显示name
变量不为空,但是,这不是导致NullPointerException的原因。问题是,什么是空的nameTextField
,而不是名称字符串。您可能还没有初始化任何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));
,让我们知道返回的是什么。