我的(非常基本的)代码中的java.lang.NullPointerException

时间:2013-12-18 15:49:45

标签: java nullpointerexception

我是编程新手,正在教自己一个在线教程。我刚才没用,并且已经有了编译错误的负载。但是,现在我的程序编译,但我得到一个空指针异常,我只是无法解决原因。我想我已经宣布了所有变量,所以我不确定我的引用是错误的。

这是我的代码(再次道歉它是如此基本):

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汉堡,那么我会得到一个空指针异常。

5 个答案:

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