【问题标题】:Nested while loop assignment gives unexpected results in Java [duplicate]嵌套的while循环赋值在Java中给出了意想不到的结果[重复]
【发布时间】:2018-11-07 09:46:05
【问题描述】:

我在 while 循环中有一个嵌套赋值,这给了我意想不到的结果。 下面的代码在将包数据写入文件的线程中运行。包是通过 ConcurrentLinkedQueue 从另一个线程接收的。

只要生产者将包放入队列,此代码就不会进入写入部分。

Packet packet = null;
while (!done || (packet = queue.poll()) != null){
    if (packet != null){
        packet.write(bufferedOutputStream);
    }
    else{
        Thread.sleep(100);
    }
}

但是,只要队列中有数据包,此代码就会进入写入部分。这对我来说是预期的行为。

Packet packet = null;
while (!done || packet != null){
    packet = queue.poll();
    if (packet != null){
        packet.write(bufferedOutputStream);
    }
    else{
        Thread.sleep(100);
    }
}

我有什么遗漏的吗?为什么这些代码 sn-ps 会产生不同的结果?

【问题讨论】:

  • 这怎么会被视为重复问题?

标签: java loops


【解决方案1】:
while (!done || (packet = queue.poll()) != null){
    ...

|| 短路。这意味着如果第一个操作数为真,则不计算第二个操作数。

对于此代码,这意味着如果 done 为 false,则不会评估 (packet = queue.poll()) != null,因此不会重新分配 packet

【讨论】:

  • 啊,没错。亲爱的,我没看到!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2013-07-19
  • 2020-05-07
  • 2014-04-09
相关资源
最近更新 更多