【问题标题】:missing or dropped loop cycles in android java switch statementandroid java switch 语句中缺少或丢弃循环周期
【发布时间】: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


    【解决方案1】:

    使用 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 的情况下,将继续使用 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;
    

    【讨论】:

    • 行了!感谢您的详细解释并指出了这个用例,否则我会对它为什么会编译感到困惑。
    【解决方案2】:

    根据我的理解,出现问题是因为您没有在每个案例之后都放上 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);
                    }
        }
    }
    

    【讨论】:

      【解决方案3】:

      您在每个case 的末尾都缺少break;

      【讨论】:

        【解决方案4】:

        查看您的 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);
                        }
        

        【讨论】:

          猜你喜欢
          • 2013-03-04
          • 1970-01-01
          • 2019-10-07
          • 2017-05-15
          • 2018-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多