从文本中读取NullPointerException

时间:2015-04-29 10:39:08

标签: java

rdd_71_1    Memory Deserialized 1x Replicated   1264.7 MB   0.0 B   node4:38759
rdd_71_10   Memory Deserialized 1x Replicated   11.6 MB     0.0 B   node1:58115
rdd_71_11   Memory Deserialized 1x Replicated   25.7 MB     0.0 B   node1:53968
rdd_71_2    Memory Deserialized 1x Replicated   72.6 MB     0.0 B   node4:54133
rdd_71_4    Memory Deserialized 1x Replicated   1260.9 MB   0.0 B   node2:33179
rdd_71_5    Memory Deserialized 1x Replicated   56.8 MB     0.0 B   node2:54222
rdd_71_7    Memory Deserialized 1x Replicated   54.5 MB     0.0 B   node4:34149
rdd_71_8    Memory Deserialized 1x Replicated   1277.8 MB   0.0 B   node1:43572
rdd_71_9    Memory Deserialized 1x Replicated   1255.8 MB   0.0 B   node1:58518

这是我创建的一种方法,用于从源读取并映射所有不同的单词,然后返回指定单词的出现次数。问题是在public static void wordCounter(String target,BufferedReader source) throws IOException { HashMap<String, Integer> map = new HashMap<String, Integer>(); while(source.readLine() != null ) { String row = source.readLine(); String[] separated = row.split(" "); for (int i=0; i< separated.length;i++) { separated[i] = separated[i].replaceAll("=+-!?'\".,:;", ""); } for (int i=0; i< separated.length;i++) { if ( map.containsKey(separated[i]) ) { int k = (Integer) map.get(separated[i]); map.put(separated[i], (k+1)); } else { map.put(separated[i], 1); } } } if (map.containsKey(target)) { System.out.println( "Target word:" + target + "\nAppears: " + map.get(otsitavSona) + " times." ); } else { System.out.println( "Target word not found in source." ); } } 行我得到一个NullPointerException。导致这种情况的原因以及如何解决问题?

感谢。

5 个答案:

答案 0 :(得分:5)

您的while声明不正确。您正在读取每一步的两行,其中第一行在while语句处被忽略。在文件末尾,第二行是null,它会抛出NullPointerExceptionwhile声明应该像

 String row;
 while((row=source.readLine()) != null ) {
  //String row = source.readLine(); -> Remove this line.
  String[] separated = row.split(" ");
  ...
 }

答案 1 :(得分:4)

在原始代码中,while语句中的第一次检查将始终通过,但第二次调用source.readLine(),它将触及流的末尾(考虑到还有一行到读取并在检查后进入循环)。根据BufferedReader.readLine()的文档,它在到达流结束时返回null,这应该是NullPointerException的原因。

答案 2 :(得分:2)

更改为

String row = source.readLine();
while(row != null ) {
             ...
             ...
             row = source.readLine(); //last line of loop
}

您的方法出现问题的原因是您在while()中首先阅读了两行,而另一行是导致row=null行中row.split(" ")导致异常的第一行。

答案 3 :(得分:1)

正如我发布的那样,我想如果我在while循环之前声明String row;并使用while ( (row = source.readLine()) != null ),这可能会有所帮助。现在一切都有效。在我原始尝试中导致NullPointerException的原因是什么?

答案 4 :(得分:0)

while循环应该如下,

String row="";
 while((row=source.readLine()) != null ) {
  //....
 }