我是编程新手,正在教自己一个在线教程。我刚才没用,并且已经有了编译错误的负载。但是,现在我的程序编译,但我得到一个空指针异常,我只是无法解决原因。我想我已经宣布了所有变量,所以我不确定我的引用是错误的。
这是我的代码(再次道歉它是如此基本):
public class CalorieCount {
public static int calCount(String[] food) {
//sets calorie count to 0
int total = 0;
//cycles through parameters passed on command line
//for each item compares item with known calorie amount
for(int i = 0; i<food.length; i++) {
String foodItem = food[i];
int foodItemCal = 0;
if (foodItem.equals("burger")) {
foodItemCal += 310;
} else if (foodItem.equals("bigmac")) {
foodItemCal += 560;
} else if (foodItem.equals("fries")) {
foodItemCal += 250;
} else if (foodItem.equals("mcnuggets")) {
foodItemCal += 170;
} else {
foodItemCal += 0;
}
//adds item calories to total
total += foodItemCal;
}
return total;
}
public static void main(String[] args) {
String[] foodArray = new String[args.length];
int calories = calCount(foodArray);
System.out.println(calories);
}
}
如果我在命令行输入java CalorieCount汉堡,那么我会得到一个空指针异常。
答案 0 :(得分:4)
String[] foodArray = new String[args.length];
这会初始化数组,但不会使用值填充它。 因此汉堡没有添加到数组中,因此不会传播到您的函数进行评估。
所以:
foodItem == null
由于数组未初始化,因此仅分配项目。 防止它们出现的无效指针总是一个好主意,在本例中是foodItem。
答案 1 :(得分:2)
您尚未在foodArray
String [] foodArray = new String [args.length];
这并不意味着您创建了args.length
String
个对象,而是创建了一个数组,该数组将保留args.length
的{{1}}个引用,并且最初都会分配String
1}}所以你必须初始化一个新的null
对象并将其分配给String
数组
foodArray
在调用for(int i = 0; i<food.length; i++)
{
foodArray [0]= "hello"; //new String(); Your code or your own values
}
函数
还有一个注意事项,建议在将int calories = calCount(foodArray);
与等式进行比较时,应将常量放在左侧以防止NPE,即避免Strings
并使用{{1 }}
答案 2 :(得分:1)
当你这样做时:
String[] foodArray = new String[args.length];
您创建一个填充空值的新数组。然后,您将此数组赋予calcount,并迭代此数组的空值。当你这样做时:
foodItem.equals("burger")
它等同于:
null.equals("burger")
你必须在你的主要方法中用你的args填充你的foodArray,让它运转起来。
还有一件事要避免这种NPE:总是在另一边测试变量相等(我的意思是先是常量,然后是你的变量):
"burger".equals(foodItem)
所以你不会得到任何NPE,因为常量"burger"
不能为空。
答案 3 :(得分:0)
if(foodItem == null){
continue;
}
答案 4 :(得分:0)
您正在将foodArray传递给main函数中的方法calCount(),该函数为null
int calories = calCount(foodArray);
首先初始化foodArray