2013-12-18 3 views
-2

Я новичок в программировании и преподаю себе онлайн-учебник. Я сейчас просто бесполезен и имел LOADS для компиляции ошибок. Однако теперь моя программа компилируется, но я получаю исключение с нулевым указателем, и я просто не могу понять, почему. Я думаю, что я объявил всю переменную, поэтому я не уверен, что я ссылаюсь неправильно.java.lang.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 гамбургер в командной строке, то я получаю исключения нулевого указателя.

+2

Просьба показать трассировку стека. Он точно указывает, в какой строке происходит исключение. Посмотрите на эту строку, узнайте, что может быть «null». Вы получаете NPE при попытке вызвать метод или получить доступ к переменной через то, что является «null». – Jesper

+4

На какой строке вы получаете исключение null-указателя? Может быть, потому, что вы объявляете массив определенного размера, но вы никогда не инициализируете его элементы, то есть 'foodArray [i] == null' для каждого' i'. – CompuChip

+0

Первое, что нужно добавить к вашему сообщению, - это сообщение об ошибке, на какой строке оно работает? Где конкретно нулевой указатель? Это поможет вам найти проблемы/отладить. Я скопировал ваш код в eclipse, и он скомпилировал файл и вернул «0» в конце, кстати. Как только я добавил «burger», это провалилось. – RossC

ответ

1

Когда вы делаете:

String[] foodArray = new String[args.length]; 

Вы создаете новый массив, заполненный нулевыми значениями. Затем вы даете этот массив вычислять, и вы повторяете нулевые значения этого массива. Когда вы делаете:

foodItem.equals("burger") 

Это эквивалентно:

null.equals("burger") 

Вы должны заполнить свой foodArray с арг в основном методе, чтобы он работал.

И еще одна вещь, чтобы избежать такого рода NPE: всегда проверять переменные равенства на другой стороне (я имею в виду первую константу, то переменную):

"burger".equals(foodItem) 

Таким образом, вы не получите любой NPE потому что константа "burger" НЕ МОЖЕТ быть нулевой.

0
if(foodItem == null){ 
    continue; 
} 
+1

Вы имеете в виду перерыв; не продолжить – dehlen

+0

'continue' может быть правильным, если ожидается, что массив разрежен. –

+0

nope, его продолжение. так что он может обрабатывать остальную часть элементов из массива! –

4
String[] foodArray = new String[args.length]; 

Это инициализирует массив, но не заполняет его значениями. Так что гамбургер не добавляется в массив и, следовательно, не распространяется на вашу функцию для оценки.

Итак:

foodItem == null 

, так как массив не инициализирован, только элементы выделяются. Всегда полезно защищать от нулевых указателей, где они могут появиться, в данном случае для foodItem.

2

Вы не инициализируются объекты массива в foodArray

String [] foodArray = новые String [арг.длина];

Это не означает, что вы создали args.lengthString объектов, а вы создали массив, который будет содержать args.length ссылки из String и первоначально все приписаны с 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);

Еще одна ремарка, рекомендуется при сравнении Strings против равенства константы должны быть размещены на левой стороне, чтобы предотвратить NPE т.е. избежать myString.equals("hello") и использовать "hello".equals(myString)

0

вы передаете foodArray методу calCount() в главной функции, a null

int calories = calCount (foodArray);

first initialize foodArray

Смежные вопросы