2015-02-24 94 views
0

读取文件并打印所有字母的字符的程序,在到达最后一行时抛出NullPointerException。在到达最后一行后,逐行读取文件行while循环

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

你想查看您正在使用的BufferedReader的javadoc。看到这里:http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html 自助是最好的帮助。 另请注意,这是一个重复的:http://stackoverflow.com/questions/16265693/how-to-use-buffered-reader-in-java 这里的答案将是相同的。 – ThePerson 2015-02-24 20:19:28

+1

为什么你会尝试阅读与线条长度一样多的线条?这并没有什么意义 – fge 2015-02-24 20:20:17

+0

While循环仅检查每次迭代**开始**处的条件。它们不会因为在下一次迭代开始时条件将为假而终止中间循环。 – chancea 2015-02-24 20:26:27

回答

0

While循环不喜欢你如何在您的评论说明他们的工作:

//这是问题的所在。当它到达最后一行时,line = null,while循环应该终止!

While循环仅检查每次迭代的开始的条件。它们不会因为在下一次迭代开始时条件将为假而终止中间循环。

所以这个空检查你在一开始while (line != null)只会始终在每次迭代的开始发生,即使line设置为null中旬迭代

所以当其他人已经表明,你可以构建您的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()所有的用途线完成后:

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 
} 
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 
} 
0

尝试while((line = read.readLine()) != null)

这在初始化每次循环对抗,而条件检查值作为。

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块的一切。

+0

Zach这应该是一个更大问题的最小工作示例。但我弄错了。 :(我更新了代码,以便它遍历每个字符并打印它,如果它是一个字母。 – Jack 2015-02-24 20:42:19

相关问题