Java交换机故障

Java交换机故障,java,Java,注意:使用Eclipse Luna(4.4 R)和ADT 23.0.2 我一直在遵循谷歌关于如何开发android应用程序的指南,在这一过程中,出于好奇,我决定一步一步地运行代码,当我按下操作栏时,执行跳转到哪里。我遇到了这个奇怪的特性,我不知道为什么会发生这种情况 基本上,动作条码具有以下切换语句: // Handle presses on the action bar items switch (item.getItemId()) { case R.id.ac

注意:使用Eclipse Luna(4.4 R)和ADT 23.0.2

我一直在遵循谷歌关于如何开发android应用程序的指南,在这一过程中,出于好奇,我决定一步一步地运行代码,当我按下操作栏时,执行跳转到哪里。我遇到了这个奇怪的特性,我不知道为什么会发生这种情况

基本上,动作条码具有以下切换语句:

    // Handle presses on the action bar items
    switch (item.getItemId()) {
        case R.id.action_search:
            openSearch();
            return true;
        case R.id.action_settings:
            openSettings();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
因此,我在开关线上放置了一个断点,当我触摸操作栏时,开关通常会转到与被触摸图标的id对应的情况

但是,执行也会经历默认情况。我之前的理解是,只有在没有匹配的情况下才会执行默认情况,那么为什么在这个场景中也会执行默认情况呢?在每种情况下遇到return语句后,该方法不是已经退出了吗?这是java switch语句的一个特性吗


更新:(如下面评论中所建议的…)

为了测试它,我声明了一个本地变量来存储id,但我还在默认块中添加了一行额外的代码。修订后的守则如下:

    // Handle presses on the action bar items
    int id = item.getItemId(); 
    switch (item.getItemId()) {
        case R.id.action_search:
            openSearch();
            return true;
        case R.id.action_settings:
            openSettings();
            return true;
        default:
            id = 0;
            return super.onOptionsItemSelected(item);
    }

如上所述,执行其中一个案例,并突出显示默认返回,但跳过(未执行)对0的id分配。因此,我认为这是一个调试器唯一的功能。哈哈,这是严重的误导=(

您发布的代码没有意外地跳转到
默认情况下,这里有一个简单的证明:

public class SO {
    public static boolean caseTest(int id) {
        switch (id) {
            case 0:
                System.out.println("Case 0:");
                return true;
            default:
                System.out.println("Default Case:");
                return false;
        }
    }

    public static void main(String[] args) {
        System.out.println("Returned:"+caseTest(0));
        //Prints:
        //Case 0:
        //Returned:true

        System.out.println("Returned:"+caseTest(1));
        //Prints:
        //Default Case:
        //Returned:false
    }
}

现在,对于可能存在的问题,请查看
R.id.action\u search
R.id.action\u设置的值,它们可能与您的想法不同。

@jhobbie:如果您在每个案例之后添加
return
,那么
break
是无法访问的代码。@jhobbie-他在每个案例的末尾都有
return
<代码>用例< /代码>。添加<代码>破解< /代码>只会导致编译器错误消息。默认代码实际上是在执行另一个案例的情况下执行的,还是调试器只是在视觉上跳到开关语句的末尾?请考虑登录ID值。@ JHOBBEI我不知道。它可能是一个“特性”。调试器,或者字节码的一些低级构造,或者它可能像Hot Clicks说的那个样跳到一个finally,但在视觉上并没有正确地将编译后的代码和源代码匹配起来。