2015-01-09 54 views
0

我正在寫一個對象類來計算每個字母的數量,當我運行我的測試代碼時,它顯示了一個空指針異常,當「abc」被傳遞時,我不知道爲什麼。測試代碼沒有錯誤,但是在我的對象類中存在一些錯誤。我該如何解決這個特定的空指針異常

public class LetterInventory { 

    private static final int COUNTER = 26; 
    private int size = 0; 
    private int[] inventory; 

    public LetterInventory() { 
    inventory = new int [COUNTER]; 
} 
    public LetterInventory (String data) { 
     data = data.toLowerCase(); 
     for(int i = 0; i < data.length(); i++) { 
     int charPosition = data.charAt(i) - 'a'; 
     if(charPosition >= 0 && charPosition < COUNTER) { 
      inventory[charPosition]++; 
      size++; 
     } 
     } 
    } 
+0

的解決方法是對所有NPE是相同的:找出什麼是零,並將其分配給一個非空引用。堆棧跟蹤會告訴您生成該文件的文件中的行號。這不是一個足夠好的提示嗎? – duffymo 2015-01-09 20:18:15

+0

NPE在哪裏? – 2015-01-09 20:18:53

+0

那麼,在一個構造函數中初始化'inventory'並且在另一個構造函數中使用它並不是很聰明。你不能同時調用兩者,所以你不能計算任何東西,或者庫存仍然是空值。 – Tom 2015-01-09 20:22:12

回答

2

您沒有在第二個構造函數中初始化數組。

public LetterInventory(String data) { 
    inventory = new int[COUNTER]; // <= initialization was missing 
    data = data.toLowerCase(); 
    for (int i = 0; i < data.length(); i++) { 
     int charPosition = data.charAt(i) - 'a'; 
     if (charPosition >= 0 && charPosition < COUNTER) { 
      inventory[charPosition]++; 
      size++; 
     } 
    } 
} 
+0

而不是在兩個地方初始化它,調用另一個構造函數:'this();'。見[DRY](http://en.m.wikipedia.org/wiki/Don%27t_repeat_yourself) – Bohemian 2015-01-09 21:09:10

+0

但是,我如何以及在哪裏使用這個? – 2015-01-09 22:55:43

0

我不許所以在這裏你去評:

public LetterInventory(String data) { 
    this(); 
    //inventory = new int[COUNTER]; // <= initialization was missing 

    data = data.toLowerCase(); 
    for (int i = 0; i < data.length(); i++) { 
     int charPosition = data.charAt(i) - 'a'; 
     if (charPosition >= 0 && charPosition < COUNTER) { 
     inventory[charPosition]++; 
     size++; 
    } 
} 
相關問題