我编写了一个从文件中读取的java程序,我需要它在文件的末尾停止,我记得使用" While(line!= null)"然而,在过去,要采取文本中的每一行,它现在不适合我。我的方法是:
int contator = 0;
String line2 = "";
while (line2 != null) {
line2 = reader2.readLine();
fi[contator]=line2;
for(int i =0;i<ret.length;i++){
System.out.println("line2 : "+line2+"ret : "+ret[i]);
if(line2.toLowerCase().contains(ret[i])){
fi[contator] = line2;
etiqueta[contator]=etiqueta[contator]+" reti";
}
}contator ++;
}
它正在工作,我看到正确的打印,但是当它必须结束时,打印最后一行为null,并退出&#34; java.lang.NullPointerException&#34 ;;打印
line2 : Number of words ret : 361.
line2 : Something here ret : 369.
line2 : other things ret : 379.23
line2 : nullret : 250.5//this is the problem, after this it throws exception
我尝试了其他方法,例如:
while (line2 != "null" )
while (line2.length()>0)
while (!line2.isEmpty)
没有任何效果,我在Eclipse IDE Mars上。任何的想法? 提前谢谢。
答案 0 :(得分:8)
while
循环检查循环的开头。通过在检查后添加line2 = reader2.readLine();
,您已经介绍了line2
现在为null
的可能性,因为reader2.readLine()
已返回null
:
while (line2 != null) { // <=== Not null here
line2 = reader2.readLine(); // <=== But now it is, because
// readLine returned null
// ...
}
如果您想使用while
循环,通常的习惯用语是:
while ((line2 = reader2.readLine()) != null) {
// ...use line2
}
分配给line2
,然后针对null
检查生成的分配值。 (这也使得循环上方的line2 = "";
变得不必要。)
这是执行作业的极少数的地方之一,通常会看到表达式,因为它很惯用。
较长的形式是:
line2 = reader2.readLine()
while (line2 != null) {
// ...use line2
// get the next one
line2 = reader2.readLine();
}
...但是通过复制该行,它引入了修改其中一个而不是另一个的可能性,引入了一个错误。
答案 1 :(得分:7)
您应该更改调用line2 = reader2.readLine();
line2 = reader2.readLine();
while (line2 != null) {
// Your code
line2 = reader2.readLine();
}
让我们使用您自己的代码作为实际示例:line2
包含流的最后一行。
while (line2 != null) { // line2 is not null right now but contains the value of the last line
line2 = reader2.readLine(); // Since the last line has been read already, this returns null
// Your code is used with null and thus throws the exception
}
答案 2 :(得分:3)
您正在将line2与null进行比较。
您正在为第2行分配新值。
你正在用line2做点什么。
嗯,这可能是什么问题?答案 3 :(得分:3)
即使line2为null,while循环的主体仍然会运行。 (您基本上使用line2的先前值作为终止条件,这当然是不正确的。)因此将抛出NPE。
为什么不将作业置于while条件下?
while ((line2 = reader2.readLine()) != null)
在循环测试中分配不是每个人的口味(有些人发现它混淆),但它有时很有用,这种情况就是其中之一。
答案 4 :(得分:1)
您已分配&#34;&#34;到第2行,然后将其与null
进行比较。
可能的解决方案可能是
while ((thisLine = br.readLine()) != null) {
System.out.println(thisLine);
}