2012-08-03 128 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