2013-06-27 52 views
12

我正在制作一个应用程序,它具有带文本的图像网格,并且每个应用程序都打开不同的活动。它工作正常,但只是为了设计目的,我想用switch statements(我认为我可以做)取代if-else statements,但它不起作用。现在我的工作代码来设置标签的每个图像是:If-else working,switch not

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);  

,但是当我这样做,永远的标签是我定义的最后一个(在我例如它将是“四”)。对于每个对象,我也有一个类似的代码,用position变量来启动不同的intent,但是,它会做相反的处理,并使每个意图等于第一个意图。我的语法错了,还是这不适合我的情况?

+32

你需要'打破;'的'case'每个语句之后,否则就流下来,所以您总能获得最后的情况。 –

+1

@SotiriosDelimanolis把它作为答案 – Blackbelt

+0

谢谢大家!我没有意识到当你没有'return'时你需要'break'' –

回答

62

您需要在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; 
} 

这里的official tutorial解释时,当不使用break;

+0

现在你有我的+1。我要指出你最近添加的关于每个被调用的案例。 – Gamb

+5

+1的解释和链接。 – Maroun

+79

一个案例开关有23 + upvotes? –

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 statement Oracle文档。

5

您需要在eace case操作后使用break语句。在开关case语句,如果你不使用break语句,那么所有的情况下,后一个特定还将

case 0: 
    textView.setText(R.string.zero);  
    break; 
9

执行使用一个break语句,每一个案件进行就可以解决问题。在最后一种情况下,我也会使用默认语句。当你不存在break,那些被称为秋天穿通物switch

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

合法用途;:

16

您需要break;每个分支后还是因为你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; 

将返回3,即使你输入2

;否则,您需要break

+3

+1表示落空。 –

+2

默认情况下,休息时总是一个很好的模式:因为有人可以在其下面添加另一个案例,并获得意外的下降。 – Gray

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; 
} 
3

的switch-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; 
default: 
    System.out.println("not available"); 
} 

你也需要把默认:最后,因为在所有情况下都是不对的时间内执行默认:动作。

切换案例声明没有忘记破解;和默认操作。

+0

默认情况下,休息时总是一个很好的模式:因为有人可以在其下面添加另一个案例并获得意外的下降。 – Gray

1

每个break语句终止封闭的switch语句。控制流程继续执行开关块后的第一条语句。 break语句是必需的,因为如果没有它们,switch块中的语句会落空:匹配case标签之后的所有语句按顺序执行,而不管后续case标号的表达式如何,直到遇到break语句为止。

开关快于if-else语句

底线:默认是可选的(就像在开关else语句),休息是必须的。

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

1

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

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

使用该填充的TextView:textView.setText(values[position]);