12

我正在制作一个应用程序,它有一个带有文本的图像网格,每个图像都打开一个不同的活动。它工作正常,但只是出于设计目的,我想用我的替换if-else statementsswitch statements我假设我可以这样做)但是它不起作用。现在我在每个图像上设置标签的工作代码是:

if(position == 0)
        textView.setText(R.string.zero);
    else if(position == 1)
        textView.setText(R.string.one);
    else if(position == 2)
        textView.setText(R.string.two);
    else if(position == 3)
        textView.setText(R.string.three);
    else if(position == 4)
        textView.setText(R.string.four);
    else if(position == 5)
        textView.setText(R.string.five);
ect....

我想使用:

switch(position)
case 0:
   textView.setText(R.string.zero);    
case 1:
   textView.setText(R.string.one);
case 2:
   textView.setText(R.string.two);    
case 3:
   textView.setText(R.string.three);
case 4:
   textView.setText(R.string.four);    

但是当我这样做时,那个标签是我定义的最后一个标签(在我的例子中它是“四”)。intent对于每个对象,我也有一个类似的代码,以使用变量开始不同的代码,position但是它的作用相反,并且使每个意图都等于第一个意图。我的语法是错误的还是对我的情况不起作用?

4

9 回答 9

62

您需要break;在 a 中的每个语句之后case执行,否则执行会向下流动(您想要的所有案例也将被调用),因此您将始终得到最后一个案例。

switch(position) {
case 0:
    textView.setText(R.string.zero); 
    break; 
case 1:
    textView.setText(R.string.one);
    break; 
case 2:
    textView.setText(R.string.two);   
    break;  
case 3:
    textView.setText(R.string.three);
    break; 
case 4:
    textView.setText(R.string.four); 
    break; 
}

这是官方教程,解释何时使用和何时不使用break;.

于 2013-06-27T14:07:57.660 回答
16

您需要break;在每个分支之后:

switch (position) {
    case 0:
        textView.setText(R.string.zero);
        break; // <-- here
    // etc
}

switch当你不存在时的合法使用break,这些被称为fall throughs;或因为你returnthrow.:

switch (someNumber) {
    case 0:
        return 0; 
        // no need for break here
    case 1:
        throw new IllegalArgumentException();
        // no need to break here
    case 2:
        System.out.println("Oh, I got two!");
        // fall through
    case 3:
        return 3;
    default:
        System.out.println("Meh")
        // No need to break: last possible branch
}

return -1;

即使您输入 2,也会返回 3。

但否则你需要break.

于 2013-06-27T14:09:03.173 回答
9

在每个 case 之后使用 break 语句应该可以解决问题。在最后一种情况之后,我也会使用默认语句。

于 2013-06-27T14:08:58.150 回答
7

这就是解决方案。您需要使用break以避免经历每种情况:

switch(position)
case 0:
   textView.setText(R.string.zero);    
   break;
case 1:
   textView.setText(R.string.one);
   break;
case 2:
   textView.setText(R.string.two);  
   break;  
case 3:
   textView.setText(R.string.three);
   break;
case 4:
   textView.setText(R.string.four);    
   break;

我建议阅读有关switch 语句的 oracle 文档。

于 2013-06-27T14:08:04.817 回答
5

您需要在 eace case 操作之后使用 break 语句。在 switch-case 语句中,如果您不使用 break 语句,那么该特定情况之后的所有情况也将被执行

case 0:
   textView.setText(R.string.zero);    
   break;
于 2013-06-27T14:08:23.843 回答
5

不要忘记break;在每个案例之后加上:像这样:

switch(position){
case 0:
   textView.setText(R.string.zero);    
   break;
case 1:
   textView.setText(R.string.one);
   break;
case 2:
   textView.setText(R.string.two);    
   break;
case 3:
   textView.setText(R.string.three);
   break;
case 4:
   textView.setText(R.string.four);  
   break;
}
于 2013-06-27T14:09:30.910 回答
3

Switch-case语句中,您需要放置break; 在每个案例之后。

switch(position){
case 0:
   textView.setText(R.string.zero);    
   break;
case 1:
  textView.setText(R.string.one);
  break;
case 2:
  textView.setText(R.string.two);    
  break;
case 3:
  textView.setText(R.string.three);
  break;
case 4:
  textView.setText(R.string.four);  
  break;
default:
    System.out.println("not available");
}

你还需要把default:最后,因为当所有情况都错误时,执行 default: 动作。

switch-case语句中不要忘记 break;和默认操作。

于 2013-06-27T14:58:07.567 回答
1

每个 break 语句都会终止封闭的 switch 语句。控制流继续 switch 块之后的第一条语句。break 语句是必要的,因为没有它们,switch 块中的语句就会失败:匹配 case 标签之后的所有语句都按顺序执行,无论后续 case 标签的表达式如何,直到遇到 break 语句。

switch 比 if-else 语句快

底线:默认值是可选的(类似于 switch 中的 else 语句),Break 是强制性的。

有趣的事实:即使您忘记放置 break 语句,您也不会看到任何编译错误。

于 2014-04-11T19:24:52.400 回答
1

在每种情况下都需要switch一个with。break但是在您的情况下,可以通过定义如下所示的数组来简单得多。

String values = {R.string.zero, R.string.one, R.string.two, ... };

使用它来填充 textView :textView.setText(values[position]);

于 2014-12-24T21:18:10.660 回答