2015-02-24 99 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

相關問題