我试图在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]);
}
答案 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