android java switch语句中缺少或丢弃循环周期
我有一个无限while循环作为我正在制作的东西的测试用例,使用switch-case逻辑显示出与if-else逻辑的可重复性和显著差异。基本上我是在循环,在{0,1,2}集合中选择一个随机数,然后等待1000毫秒再选择另一个数。if语句逻辑按预期工作(即每1000毫秒打印一次日志,并带有非RTOS预期的一些微秒漂移)。另一方面,switch语句似乎是我所描述的尽力系统(即,每条打印行的计时是1000 ms的倍数,但多次迭代都无法打印)。换句话说,我会看到我的日志输出打印出如下内容 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 用于开关逻辑。我还注意到一些可能相关的其他细节:android java switch语句中缺少或丢弃循环周期,java,android,if-statement,switch-statement,Java,Android,If Statement,Switch Statement,我有一个无限while循环作为我正在制作的东西的测试用例,使用switch-case逻辑显示出与if-else逻辑的可重复性和显著差异。基本上我是在循环,在{0,1,2}集合中选择一个随机数,然后等待1000毫秒再选择另一个数。if语句逻辑按预期工作(即每1000毫秒打印一次日志,并带有非RTOS预期的一些微秒漂移)。另一方面,switch语句似乎是我所描述的尽力系统(即,每条打印行的计时是1000 ms的倍数,但多次迭代都无法打印)。换句话说,我会看到我的日志输出打印出如下内容 17:50:5
- 这方面没有明显的模式(即每X个时间步或类似的东西都没有丢失间隔)
- 我在交换机上添加了一个默认案例,认为我可能出于任何原因遗漏了一个案例,但事实并非如此(双关语)
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);
}
}
}
如果有什么不同,这里有我的开发系统的各种规格:
PC操作系统:Ubuntu 18.04
安卓操作系统:5.1.1
电话:nexus4
Android Studio 3.5.2使用开关,您需要告诉案例应该“中断”在哪里,否则您也会在其他案例中失败
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的情况下,将继续使用case1、case2,一直到默认情况。
这可能是你想要的。考虑一个程序,您希望以相同的方式处理两种情况。使用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;
您缺少
break
在每个案例的末尾
根据我的理解,出现问题的原因是您没有在每个案例后面都放置break语句,所以只需放置一个break
,然后像我下面的代码一样尝试
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();
}
break;
case 1:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case 2:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
default:
Log.i("distribution", "default case selected with action = " + action);
}
}
}
看看你的switch语句,你似乎忘记了在每次检查后都要断开 试试这样的
switch (action){
case 0:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case 1:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case 2:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
default:
Log.i("distribution", "default case selected with action = " + action);
}
那就行了!感谢您的详细解释,并指出了这方面的用例,否则我会对它为什么会编译感到困惑。
switch (action){
case 0:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case 1:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case 2:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
default:
Log.i("distribution", "default case selected with action = " + action);
}