2012-08-03 126 views
0

我有一個while循環,它將使用Buffered Reader讀取的元素添加到ArrayList中。該循環工作正常,除非它完成,應用程序似乎並沒有繼續前進。相關的代碼是:循環結束,但不是

  int ctr = 1; 
      while((test = bf.readLine()) != null) 
      { 

       Log.i(TAG, test); 
       users.add(test); 
       Log.i(TAG, "" + (ctr++)); 

      } 
      Log.i(TAG, "Loop done."); 

循環中的兩個日誌語句每個執行4次,這是正常行爲。但是,循環後面的語句不會執行。就像它被卡住了一樣。我很確定它不會進入循環,因爲裏面的兩個日誌語句不再執行。

bf是BufferedReader,用戶是ArrayList。

logcat的輸出:

08-04 01:35:37.472: I/UM(2937):  UserInfo{0:Primary:3} 
08-04 01:35:37.472: I/UM(2937): 1 
08-04 01:35:37.476: I/UM(2937):  UserInfo{1:Test1:0} 
08-04 01:35:37.476: I/UM(2937): 2 
08-04 01:35:37.476: I/UM(2937):  UserInfo{2:test2:0} 
08-04 01:35:37.480: I/UM(2937): 3 
08-04 01:35:37.480: I/UM(2937):  UserInfo{3:testxyz:0} 
08-04 01:35:37.480: I/UM(2937): 4 

沒有任何人有任何想法我(可能是愚蠢的)錯誤是什麼?

+1

您可以包含日誌語句嗎?另外,你說「循環中的兩個日誌語句每次執行4次」和「內部的兩個日誌語句不執行」 - 這是什麼? – Benoir 2012-08-03 20:14:27

+0

我的意思是,它們按預期執行4次,並且執行次數不超過4次,這讓我相信循環不會再運行了。 – 2012-08-03 20:15:13

+0

當您使用調試器遍歷代碼時,您發現了什麼? – 2012-08-03 20:15:14

回答

2

我希望它的條件:

while((test = bf.readLine()) != null) 

認爲它是這樣的:

Console ("line1\nline2\n") 
----> BufferedReader ("line1\n", "line2\n") 
----> bf.readline() ("line1\n") 
----> bf.readline() ("line2\n") 

您的條件正在檢查控制檯何時完全關閉其連接,此時BufferedReader將注意並返回null

實際情況是控制檯與BufferedReader的連接仍然打開。在readLine()將返回「line3 \ n」之前,BufferedReader正在等待另一個\n從控制檯傳入。

3

代碼阻止就行了:

while((test = bf.readLine()) != null) 

而且它這樣做,因爲數據提供給bf流是永遠不會被關閉。

(這個答案是不是我的,它只是從註釋的快速摘要。)

+0

如果Izkata不在幾分鐘內發帖,我會接受。當他首先提供解決方案時,首選就是那個。 – 2012-08-03 20:30:46