注意:使用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的赋值被跳过(未执行)。所以我认为这只是一个调试器功能。大声笑。这是一种严重的误导。 =(
答案 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_search
和R.id.action_settings
的值,它们可能不是您的想法。