【问题标题】:(line != null) not working in Java BufferedReader(行!= null)在Java BufferedReader中不起作用
【发布时间】:2016-07-01 11:49:59
【问题描述】:

我正在编写一个从文件读取的 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 打印最后一行,并以“java.lang.NullPointerException”退出;打印

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.2 上;任何的想法? 提前致谢。

【问题讨论】:

  • while (line2 != "null" ) 请重新考虑这种方法并考虑它的真正作用。特别想"null"的含义。
  • 是的,我知道这没有任何意义,我在这里对字符串进行某种“强制转换”,我有点迷失了,可能要花很多时间编程。
  • 不,你没有在这里转换任何东西,因为 line2 已经是一个字符串,但是你正在检查变量 line2 是否引用了与字符串文字 @987654328 相同的字符串对象@。而"null"null 非常不同。但是您已经知道为什么您原来的 while (line2 != null) 不能正常工作,所以这一切都很好:)。

标签: java arrays nullpointerexception bufferedreader


【解决方案1】:

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();
}

...但是通过复制该行,它引入了您将修改其中一个而不是另一个的可能性,从而引入了一个错误。

【讨论】:

    【解决方案2】:

    你应该改变调用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
    }
    

    【讨论】:

      【解决方案3】:

      您正在将 line2 与 null 进行比较。

      您正在为 line2 分配一个新值。

      你正在用 line2 做一些事情。

      嗯,这可能是什么问题?

      【讨论】:

      • “嗯,这可能是什么问题?”是的,这就是OP的要求。 (虽然这指向了正确的方向,但这并不是真正的答案,更像是评论)
      • 我相信会有很多人直接向他抛出完整的解决方案。所以,如果有人邀请他退后一步,让他有机会弄清楚发生了什么,这有什么关系……有时你只需要有人告诉你,你可以从不同的角度看待你的问题。跨度>
      • 这个答案让我很困扰,有时编程你可能会出现失误而看不到发生了什么,如果你用很多语言编程,如果你不打算回答,这种情况很常见,请保存它,或者您可以发表评论,但我在这里看不到原因
      • @Amnor 这并不是粗鲁的。我只是将您的代码改写为人类语言。你知道,去掉那些阻止你进入这个问题的(非常简单的)核心的抽象。
      • 对不起,我看到问题很简单,我只是没看到。 @Yassin Hajaj 回答有效
      【解决方案4】:

      即使 line2 为空,while 循环的主体仍将运行。 (你实际上是在使用 line2 之前的值作为终止条件,这当然是不正确的。)所以会抛出 NPE。

      为什么不把赋值放在while条件里面?

      while ((line2 = reader2.readLine()) != null)
      

      在循环测试中分配并不是每个人都喜欢的(有些人觉得它令人困惑)但它有时很有用,这种情况就是其中之一。

      【讨论】:

        【解决方案5】:

        您已将 "" 分配给 line2,然后将其与 null 进行比较。 可能的解决方案是

        while ((thisLine = br.readLine()) != null) {
            System.out.println(thisLine);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-04
          • 1970-01-01
          • 1970-01-01
          • 2021-02-14
          • 2016-09-30
          • 2014-04-22
          • 2014-11-21
          相关资源
          最近更新 更多