NullPointerException,在HashMap内部有一个ArrayList

时间:2014-06-16 15:56:14

标签: java arraylist nullpointerexception hashmap

我试图在hashmap中使用arraylist来创建和迭代供给processLine方法的不同字符的计数器。我想我已声明所有变量和catch语句应该处理hashmap中没有条目的情况,但我仍然在 curCounts.set上获得NullPointerException(i,1 ); 第二个catch语句中的行。我可能犯了一些愚蠢的错误,但我无法弄清楚它是什么。

HashMap<Character, ArrayList<Integer>> charCounts;

public DigitCount() { charCounts = new HashMap<>(); }


public void processLine (String curLine) {

    int length = curLine.length();
    char curChar;
    ArrayList<Integer> curCounts;
    Integer curCount;

    for(int i = 0; i < length; i++){
        curChar = curLine.charAt(i);
        try {
            curCounts = charCounts.get(i);
        } catch (NullPointerException ex) {
            curCounts = new ArrayList<>();
        }

        try {
            curCount = curCounts.get(i);
            curCount++;
            curCounts.set(i, curCount);
        } catch (NullPointerException ex) {
            curCounts.set(i, 1);
        }

        charCounts.put(curChar, curCounts);
    }

    linesProcessed++;
    System.out.println("---------------------------" + linesProcessed);
}

编辑:是的,我的确打电话给DigitCount。

public static void main(String args[]) throws Exception
{
    //creates an instance of the digitCount object and starts the run method
    DigitCount counter = new DigitCount();
    counter.run(args[0]);
}

1 个答案:

答案 0 :(得分:1)

如果charConts不包含i(如在charCounts.get(i)中),则它不会抛出NullPointerException,它将返回null。因此,您应该使用if而不是trycatch,如下所示:

curCounts = charCounts.get(i);
if(curCounts==null)
    curCounts = new ArrayList<>();

编辑:或者,如果您使用的是Java 8,则可以执行

curCounts = charCounts.getOrDefault(i,new ArrayList<Integer>());

如果它不包含一个

,它将自动默认创建一个新的ArrayList