逐行读取文件 - 在到达最后一行后循环终止

时间:2015-02-24 20:18:33

标签: java loops io

程序读取文件并打印所有字母字符,当它到达最后一行时抛出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));
                }
            }
        }
    }

}

4 个答案:

答案 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
}