2015-04-29 77 views
0
public static void wordCounter(String target,BufferedReader source) throws IOException { 
     HashMap<String, Integer> map = new HashMap<String, Integer>(); 

     while(source.readLine() != null) { 
      String row = source.readLine(); 
      String[] separated = row.split(" "); 
      for (int i=0; i< separated.length;i++) { 
       separated[i] = separated[i].replaceAll("=+-!?'\".,:;", ""); 
      } 

      for (int i=0; i< separated.length;i++) { 
       if (map.containsKey(separated[i])) { 
        int k = (Integer) map.get(separated[i]); 
        map.put(separated[i], (k+1)); 
       } 
       else { 
        map.put(separated[i], 1); 
       } 
      } 
     } 

     if (map.containsKey(target)) { 
      System.out.println("Target word:" + target + 
        "\nAppears: " + map.get(otsitavSona) + " times."); 
     } 
     else { 
      System.out.println("Target word not found in source."); 
     } 
    } 

這是我創建的一種方法,用於從源讀取並映射所有不同的單詞,然後返回指定單詞出現的次數。問題是在線String[] separated = row.split(" ");我得到一個NullPointerException。是什麼導致了這個問題,我該如何解決這個問題?NullPointerException從文本中讀取

謝謝。

回答

4

在原來的代碼,在while語句首先檢查總會通過,但第二次source.readLine()被調用時,它會擊中流的末尾(考慮當再有一行需要讀取時以及在檢查它進入循環之後)的情況。根據BufferedReader.readLine()的文檔,它在到達流結束時返回null,這應該是NullPointerException的原因。

+0

謝謝您闡述,現在我明白了。 –

5

您的while聲明不正確。您在每一步都讀取兩行,第一行在while語句處被忽略。在檔案末尾,第二行是null,其中NullPointerExceptionwhile聲明應該像

String row; 
while((row=source.readLine()) != null) { 
    //String row = source.readLine(); -> Remove this line. 
    String[] separated = row.split(" "); 
    ... 
} 
2

更改爲

String row = source.readLine(); 
while(row != null) { 
      ... 
      ... 
      row = source.readLine(); //last line of loop 
} 

問題與你的做法是,你是第一個在while()兩次讀線等是導致row=null而在row.split(" ")造成異常的第一行行

1

就像我發佈這個,我想也許這將有所幫助,如果我在while循環之前宣佈String row;並且使用while ((row = source.readLine()) != null) 。現在一切正常。在我的原始嘗試中導致NullPointerException的原因是什麼?

+1

在您的原始文章中,您正在閱讀兩行文字,並且僅檢查每個迭代中第一行是否爲空 – giorashc

0

while循環應該如下,

String row=""; 
while((row=source.readLine()) != null) { 
    //.... 
}