程序读取文件并打印所有字母字符,当它到达最后一行时抛出NullPointerException。
import java.io.*;
public class Foo {
public static void main(String[] args) throws IOException {
FileReader file = new FileReader(new File("source.txt"));
BufferedReader read = new BufferedReader(file);
String line = read.readLine();
while (line != null) {
for (int i = 0; i < line.length(); i++) {
line = read.readLine(); // this is where the problem is. When it reaches the last line, line = null and the while loop should terminate!
if (Character.isLetter(line.charAt(i))) {
System.out.print(line.charAt(i));
}
}
}
}
}
答案 0 :(得分:1)
只要意识到你可以这样做:
String line = null;
while ((line = read.readLine()) != null) {
for(int i=0; i<line.length(); ++i)
{
if(Character.isLetter(line.charAt(i)))
System.out.println(line.charAt(i));
}
}
不要忘记关闭流,最好将所有内容封装在try块中。
答案 1 :(得分:0)
你的for (int i = 0; i < line.length(); i++)
在这里没有意义。行的长度与文件中的行数无关。
将您的代码更改为:
String line = null;
while ((line = readLine()) != null) {
System.out.println(line.length());
// do what ever you need with line
}
答案 2 :(得分:0)
尝试while((line = read.readLine()) != null)
这会在每次循环迭代时将值初始化为与while条件进行检查。
答案 3 :(得分:0)
虽然循环不像你在评论中解释的那样有效:
//这就是问题所在。当它到达最后一行时,line = null并且while循环应该终止!
while循环仅检查每次迭代的 start 的条件。它们不会因为在下一次迭代开始时条件为假而终止中间循环。
因此,即使while (line != null)
设置为line
,您在开始时null
的空检查也只会始终发生在每次迭代的开始中。 } mid iteration
正如其他人已经表明你可以构建你的while循环:
String line = null;
while ((line = read.readLine()) != null)
{
for (int i = 0; i < line.length(); i++)
{
if (Character.isLetter(line.charAt(i)))
{
System.out.print(line.charAt(i));
}
}
}
并从代码中删除所有其他read.readLine()
语句。 (这是最短的代码行。)
或者,如果您希望更明确地提供更多可读性,则可以保留初始read.readLine()
,但在完成对线的所有使用后,将迭代read.readLine()
移至:< / p>
String line = read.readLine();
while (line != null)
{
for (int i = 0; i < line.length(); i++)
{
if (Character.isLetter(line.charAt(i)))
{
System.out.print(line.charAt(i));
}
}
line = read.readLine();
//line is never used after this so an NPE is not possible
}