我正在使用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
函数的不同文件中,它工作得很完美,所以我很困惑哪里出了问题。
2条答案
按热度按时间lnvxswe21#
嗯,基本上是因为你的“有条件支票"。
javadoc表示方法readLine()返回:包含行内容的String,不包括任何行终止字符,如果已到达流结尾,则为null。
所以在流的末尾你会得到一个null,现在,因为**OR(||)**运算符,则将检查条件语句,直到找到true语句为止。
这是因为'short-circuits-logical-operators' in Java.
因此,您将检查条件:
然后因为Or在搜索一个true条件,你将检查
如果要避免这种情况,可以在相同条件下使用**&&(and)**运算符。
这样,如果ln为空,您将检查第一个条件
然后因为And运算符要求每个条件都为真才能被验证,所以您将中断while循环。
请记住但是,如果您有一行是空的“”,则长度将为0,因此while循环将停止。
omqzjyyz2#
好吧,我想你可以把代码改成:
这个过程是先检查行是否为空,如果不为空,再检查行是否有内容,如果有内容,在非空的非空行上执行操作,在所有情况下,读取下一行。