Java开关漏掉了

时间:2014-08-06 18:53:53

标签: java

注意:使用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语句的一个特性吗?


更新:(正如以下评论中所建议的那样......)

因此,为了测试它,我声明了一个本地var来存储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);
    }

如上所述,其中一个案例被执行,并且默认返回也被突出显示,但是id的赋值被跳过(未执行)。所以我认为这只是一个调试器功能。大声笑。这是一种严重的误导。 =(

1 个答案:

答案 0 :(得分:0)

您发布的代码没有不可预测地跳到default案例,这是一个简单的证明:

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_searchR.id.action_settings的值,它们可能不是您的想法。