(line!= null)在Java BufferedReader中不起作用

时间:2016-07-01 11:49:59

标签: java arrays nullpointerexception bufferedreader

我编写了一个从文件中读取的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上。任何的想法? 提前谢谢。

5 个答案:

答案 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);
}