【发布时间】:2019-11-06 09:07:14
【问题描述】:
我有一个无限的 while 循环作为我正在制作的东西的测试用例,并且使用 switch case 逻辑与 if else 逻辑显示出可重复且显着的差异。本质上,我正在循环,在 {0,1,2} 集合之间选择一个随机数,然后等待 1000 毫秒,然后再选择另一个数字。 if 语句逻辑按预期工作(即每 1000 毫秒打印到日志,并带有一些非 RTOS 预期的小微秒漂移)。另一方面,switch 语句似乎是我所描述的尽力而为的系统(即每条打印线的时间是 1000 毫秒的倍数,但几次迭代只是从不打印。)。换句话说,我会看到我的日志输出打印出类似
17:50:50:00:1
17:50:51:00:2
17:50:52:01:3
17:50:53:01:4
17:50:54:02:5
用于 if 逻辑,但类似于
17:50:50:00:1
17:50:53:01:4
17:50:54:02:5
用于开关逻辑。我还注意到了一些其他可能相关的细节:
- 这并没有立即明显的模式(即没有每 X 时间步的丢失间隔或类似的东西。)
- 我在开关上添加了一个默认案例,认为我可能会因为某种原因而遗漏一个案例,但事实并非如此(双关语)。
这有什么明显的原因吗? Java/Android 是否优先考虑 if 语句代码并接受 switch 语句的缺失返回或类似的东西?只需使用 if 语句代替 switch 语句即可解决我的问题,但我只是好奇为什么这是必要的?还是我只是在语法中犯了一些简单的错字错误,导致 switch 语句中出现这种意外行为?
这有点伪代码,但它说明了产生我所看到的差异的唯一更改(即,还有其他代码在起作用,但除此之外没有任何变化)。下面你会看到 switch case 和 if else 逻辑:
public void run(){
while(true){
action = randomIntBetweenZeroAndTwo()
Log.i('actions', String.valueOf(action));
switch (action){
case 0:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
case 1:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
case 2:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
default:
Log.i("distribution", "default case selected with action = " + action);
}
}
}
public void run(){
while(true){
action = randomIntBetweenZeroAndTwo()
Log.i('actions', String.valueOf(action));
if (action == 0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else if (action == 1){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
如果有什么不同,这里是我的开发系统的各种规格:
PC 操作系统:Ubuntu 18.04
安卓操作系统:5.1.1
电话:Nexus 4
Android Studio 3.5.2
【问题讨论】:
标签: java android if-statement switch-statement