2013-12-18 21 views
-2

我是編程的新手,並且正在教我自己的在線教程。我現在很無用,並且有編譯錯誤的負擔。然而,現在我的程序編譯,但我得到一個空指針異常,我只是不能解決原因。我想我已經聲明瞭所有的變量,所以我不確定我所引用的錯誤。在我的(非常基本的)代碼中的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。 – Jesper

+4

你會在哪一行得到空指針異常?難道是因爲你正在聲明一個特定大小的數組,但是你永遠不會初始化它的元素,例如'foodArray [i] == null'爲每個'i'。 – CompuChip

+0

要添加到您的文章的第一件事是錯誤消息,它是什麼線?空指針特別在哪裏?這將幫助您找到問題/調試。我將你的代碼複製到eclipse中,它編譯得很好,並在最後返回「0」。一旦我添加了「漢堡」就失敗了。 – 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

不行,其繼續。以便它可以處理陣列中其餘的元素! –

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

這初始化數組但不與值填充它。 所以漢堡沒有添加到數組中,因此不會傳播到您的函數進行評估。

所以:

foodItem == null 

因爲數組沒有初始化,只有項目分配。 在這種情況下,爲了foodItem,防止可能出現的空指針總是一個好主意。

2

你尚未foodArray

字符串[] foodArray =新的String [參數初始化所述陣列的對象。長度];

這並不意味着你已經創建args.lengthString對象,而你已經創建了一個數組,其將持有的String,最初所有與null分配args.length引用,所以你必須初始化一個新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() null null

int calories = calCount(foodArray);

首先初始化食物Arrayray