gpt4 book ai didi

java - android java switch 语句中缺少或删除循环周期

转载 作者:行者123 更新时间:2023-12-01 07:43:58 24 4
gpt4 key购买 nike

我有一个无限的 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

最佳答案

使用 switch 时,您需要告诉情况应该在哪里“中断”,否则您也会遇到其他情况。

switch (action){
case 0:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
...
default:
Log.i("distribution", "default case selected with action = " + action);
}

在不破坏 0-case 的情况下,您的 0-case 将继续使用 case 1、case 2,一直到默认 case。这可能就是你想要的。考虑一个您想要以相同方式处理两种情况的程序。使用 if 语句,您可以执行以下操作:

if (action == 0 || action == 1) {
...
}

在 switch 语句中,这将是:

case 0:
// prerhaps do some unique preprocessing (note: in this case this would differ from the above if-snippet)
// because here is no break we will "fall through to 2"
case 1:
....
break; // we will stop here and do NOT continue with case 2.

case 2:
break;

关于java - android java switch 语句中缺少或删除循环周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58726498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com