android java switch语句中缺少或丢弃循环周期

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

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

用于开关逻辑。我还注意到一些可能相关的其他细节:

  • 这方面没有明显的模式(即每X个时间步或类似的东西都没有丢失间隔)
  • 我在交换机上添加了一个默认案例,认为我可能出于任何原因遗漏了一个案例,但事实并非如此(双关语)
有什么明显的原因吗?Java/Android是否对if语句代码给予更高的优先级,并接受switch语句丢失的返回或类似的内容?我的问题是通过使用if语句代替switch语句来解决的,但我只是好奇为什么这是必要的?或者我只是在语法上犯了一些拼写错误,导致switch语句出现这种意外行为

这有点像psudocode,但它说明了产生我所看到的差异的唯一变化(即,有其他代码在起作用,但除了这个没有任何变化)。下面您将看到开关盒和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);
                }
    }
}
如果有什么不同,这里有我的开发系统的各种规格:

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);
                }