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

标签 java android if-statement switch-statement

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

相关文章:

r - 解释来自 "condition has length > 1"函数的 `if` 警告

vb.net - VB.NET 中的囚徒困境 - 与 "Else If"相关的编译错误

java - 如何使用嵌套循环每次打印字符串时取出字符串的最后一个字符

java - 在 java 8::method 引用中使用空对象的实例方法

java - spring boot starter security post 方法不起作用

android - Roboguice、AndroidAnnotations 和线程间的事件

android - json解析将html标签转为转义序列

java - 将 TextField 的值设置为随机数

java - 最小的 API 与便利

java - 解析 JsonObjectRequest