2015-01-09 82 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++; 
    } 
}