我有一个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
有人知道我的(可能是愚蠢的)错误是什么吗?
答案 0 :(得分:3)
您的代码在线上阻止:
while((test = bf.readLine()) != null)
这样做是因为向bf
提供数据的流永远不会被关闭。
(这个答案不是我的,只是评论的快速摘要。)
答案 1 :(得分:2)
我希望这是条件:
while((test = bf.readLine()) != null)
这样想:
Console ("line1\nline2\n")
----> BufferedReader ("line1\n", "line2\n")
----> bf.readline() ("line1\n")
----> bf.readline() ("line2\n")
您的条件是检查Console何时完全关闭其连接,此时BufferedReader会注意到并返回null
。
实际发生的事情是Console与BufferedReader的连接仍然是打开的。 BufferedReader正在等待另一个\n
从控制台传入,readLine()
将返回“line3 \ n”。