阅读中的Java NullPointerException

时间:2014-06-19 14:15:26

标签: java bufferedreader

我从我的套接字读取时遇到问题我只有在值不为零时读取但它不起作用。

@Override
public void run() {
    System.out.println("Reading from socket");
    while(true){
        try {
            if(!(br.readLine().equals(null)))read += br.readLine();
        } catch (IOException e) {
            System.out.println("error " + e);
        }
    }
}

这是错误:

  

线程中的异常"线程-4"显示java.lang.NullPointerException       at connection.CreateConnection.run(CreateConnection.java:61)       在java.lang.Thread.run(未知来源)

3 个答案:

答案 0 :(得分:8)

如果br.readLine()返回null,则在其上调用.equals(null)将引发异常 - 它不会返回true。您只想将引用标识与null进行比较。

调用.equals(null) 从不有用,除非您正在测试equals实施是否正常运行:)

此外,您将通过在每次循环迭代时调用readLine()两次来跳过所有其他行。

你想要这样的东西:

String line;
if ((line = br.readLine()) != null) {
    read += line;
}

...除了由于重复的字符串连接而会非常缓慢。您几乎肯定会使用StringBuilder代替。

此外,在一个捕获IOException的循环中完成所有这些似乎是一个灾难的处方 - 如果一个调用失败,它非常可能会永远失败,那么你的程序基本上是挂在一个紧凑的循环中。当你得到异常时,你几乎肯定会停止,而不是坚持下去。例如:

try {
    String line;
    while ((line = reader.readLine()) != null) {
        read += line; // Or builder.append(line);
    }
} catch (IOException e) {
    // Whatever you want to do
}

最后,考虑空格的值,包括水平和垂直,以及使用大括号的好处,即使在单语句if语句等中也是如此。行if(!(br.readLine().equals(null)))read += br.readLine();是紧凑的,代价是可读性。

答案 1 :(得分:0)

假设您在文件的最后一行,请调用br.readLine()来检查它是否为空。您的行存在,以便您的测试通过。然后再次调用br.readLine()。不幸的是,没有什么可读的!你得到了例外。

重写你的代码:

@Override
public void run() {
    System.out.println("Reading from socket");
    String line;
    while(true){
        try {
            line = br.readLine()
            if((line != null))read += line;
        } catch (IOException e) {
            System.out.println("error " + e);
        }
    }
}

答案 2 :(得分:-1)

您正在对空对象调用.equals(),这会导致我假设的空指针问题。如果您想使用缓冲读卡器阅读,请尝试执行以下操作:

        String line = reader.readLine();
        while(line != null){
            System.out.println(line);
            line = reader.readLine();
        }

这将消除空指针的问题,并且还会阻止您在阅读过程中跳过任何行。