【问题标题】:Why does this code work with if statement but not while loop?为什么这段代码适用于 if 语句而不适用于 while 循环?
【发布时间】:2016-04-08 09:42:22
【问题描述】:
public void timerCallback()
{
    if (count < 8)
    {
        System.out.println("My timer woke up!");
        this.setOutputState(this.pinNumber, this.pinState);
        this.pinState = !this.pinState;
        this.setTimer(this.timerDelay);
        count++;
    }else
     {
        this.stopMonitoring();
     }
}

从某种意义上说,它打印语句(有延迟)8 次,然后终止程序。现在这样:

public void timerCallback()
{
    while (count < 8)
    {
        System.out.println("My timer woke up!");
        this.setOutputState(this.pinNumber, this.pinState);
        this.pinState = !this.pinState;
        this.setTimer(this.timerDelay);
        count++;
    } 
        this.stopMonitoring();
}

该代码一次只打印该语句 8 次,然后终止。这是为什么?

【问题讨论】:

  • 您的第一个示例要求为“我的计时器醒来!”的 每个 输出调用 timerCallback(),而您的第二个示例在 一个致电timerCallback()while 将继续重新执行下面的语句或阻塞,直到条件失败。 if 仅在条件为真时执行该块一次。
  • 你会想知道ifwhile之间的区别...
  • 这里有一个提示...timerCallback() 何时被调用?看起来你希望它在 stopMonitoring() 之前被调用 8 次,那么是什么让它被调用了 8 次?
  • 不是递归问题的副本。这个问题都是关于触发回调的。这里没有递归。 (尽管由于while/if 混淆,它确实有一些相似之处......)

标签: java if-statement interface while-loop hardware-interface


【解决方案1】:

原始版本中if/else 的目的是在调用stopMonitoring() 之前给定时器八次“唤醒”和切换引脚状态的机会。打印消息是次要的。所以if/else 检查timerCallback() 是否被调用了8 次。如果还没有,好的,打印消息并再给它一次机会。

通过替换 while,您最终只需打印 8 次消息,快速来回切换 pin 状态而不检查它是否有帮助,然后进入 stopMonitoring()。所以你在第一次调用timerCallback() 后停止监控,而不是第八次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多