0

我对 BufferedReader 类的 readLine() 感到困惑。我有以下代码:</p>

BufferedReader ir=new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));
StringBuffer sb=new StringBuffer();

while(ir.readLine()!=null){
      String tmp=ir.readLine();
      sb.append(tmp);
      if(tmp!=null){
      Log.i("recHtml", tmp);
      }

该代码按预期工作。但是,如果我们删除

        if(tmp!=null){

然后代码将得到一个空指针异常

        Log.i("recHtml", tmp);

我很困惑。我已经在 while 语句中检查了这一点,为什么仍然存在空指针错误?

4

4 回答 4

7
while(ir.readLine()!=null){
    //...
}

这已经读了一行,所以当你想真正获得你检查过的那一行时,你会得到下一行。在最后一种情况下,它为空,因为没有其他行了。

检查实际上应该使用hasNextLine为该检查定义的方法完成:

while(ir.hasNextLine()){
    //...
}
于 2013-10-30T13:22:41.643 回答
1

您正在阅读该行两次。第二次,您可能会到达文件末尾并收到空值。在 while 循环之外引入你的tmp变量,这样你每次只读取一次:

String tmp = null;
while((tmp = ir.readLine()) !=null){
    sb.append(tmp);
    Log.i("recHtml", tmp);
}
于 2013-10-30T13:23:23.927 回答
1

您在一个周期内阅读 2 行。

将您的代码更改为这样的内容。

String tmp= null;
while( (tmp = ir.readLine()) !=null){
      sb.append(tmp);
      Log.i("recHtml", tmp);
}
于 2013-10-30T13:23:51.903 回答
0

是的,通过在 while 循环中使用 readLine() 两次,您正在阅读两次。第一次它从 while 循环中的第一个 readLine 读取,如果控件进入 while 循环体,则再次读取第二个 readLine(),它将字符串读取为 null。这就是它给出空指针异常的原因。

尝试在 while 循环中使用一次 readLine()。

于 2013-10-30T14:01:05.297 回答