java 在BufferedReading期间对不应为空的字符串调用String.length()时,我收到NullPointerException

bjg7j2ky  于 2023-02-07  发布在  Java
关注(0)|答案(2)|浏览(123)

我正在使用BufferedReader方法读取一个文件,该文件由多行项目组成,这些项目由多白色分隔,我正在使用while循环遍历文件的每一行,条件是我刚刚读取的行不是null或空白。
我读了第一行,然后进入循环,然后我得到了一个NullPointerException,我的行是null,但它不应该是,因为我刚刚读了它。

public ReadFile(String filename) {
    try {
        BufferedReader br = new BufferedReader(new FileReader(filename));
        String ln;
        ln = br.readLine();

        // loops as long as the last line read is not null or blank
        while (ln != null || ln.length() != 0) {
            //do stuff with ln
            ln = br.readLine();
        }
        br.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

我希望逐行循环阅读文件,直到行是null或空白(如果最后一行是“”)。然而,这并没有发生,当while循环运行时,该行是空的。我尝试了完全相同的实现,但在main函数的不同文件中,它工作得很完美,所以我很困惑哪里出了问题。

lnvxswe2

lnvxswe21#

嗯,基本上是因为你的“有条件支票"。
javadoc表示方法readLine()返回:包含行内容的String,不包括任何行终止字符,如果已到达流结尾,则为null。
所以在流的末尾你会得到一个null,现在,因为**OR(||)**运算符,则将检查条件语句,直到找到true语句为止。

这是因为'short-circuits-logical-operators' in Java.

因此,您将检查条件:

ln!=null => false

然后因为Or在搜索一个true条件,你将检查

ln.length() => and get a NullPointerException

如果要避免这种情况,可以在相同条件下使用**&&(and)**运算符。
这样,如果ln为空,您将检查第一个条件

ln!=null => false

然后因为And运算符要求每个条件都为真才能被验证,所以您将中断while循环。

while (ln != null && ln.length() != 0){
            //do stuff with ln
            ln = br.readLine();
        }ln = null;

请记住但是,如果您有一行是空的“”,则长度将为0,因此while循环将停止

omqzjyyz

omqzjyyz2#

好吧,我想你可以把代码改成:

while (ln!=null) {
            //we check if the line is not empty
            if(ln.length() !=0) {
                //do your operations
            }
            //read the next line
            ln = br.readLine();
        }

这个过程是先检查行是否为空,如果不为空,再检查行是否有内容,如果有内容,在非空的非空行上执行操作,在所有情况下,读取下一行。

相关问题