2013-06-27 140 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]);