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。导致这种情况的原因以及如何解决问题?
感谢。
答案 0 :(得分:5)
您的while
声明不正确。您正在读取每一步的两行,其中第一行在while语句处被忽略。在文件末尾,第二行是null
,它会抛出NullPointerException
。 while
声明应该像
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 ) {
//....
}