2011-11-09 39 views
4

我有這樣的代碼跟我從post得到了switch語句,其工作絕對沒問題:在switch語句中,爲什麼所有的情況都被執行?

String getOrdinal(final int day) { 
    if (day >= 11 && day <= 13) { 
     return "th"; 
    } 
    switch (day % 10) { 
     case 1: return "st"; 
     case 2: return "nd"; 
     case 3: return "rd"; 
     default: return "th"; 
    } 
} 

,但如果我將其更改爲這樣的事情,它打破了,因爲所有的情況下,除了情況1變執行:

static String getOrdinal(final int day) { 
    StringBuilder ordinalBuilder = new StringBuilder(); 
    ordinalBuilder.append("<sup>"); 
    if (day >= 11 && day <= 13) { 
     ordinalBuilder.append("th") ; 
    } 
    switch (day % 10) { 
     case 1: ordinalBuilder.append("st"); 
     case 2: ordinalBuilder.append("nd"); 
     case 3: ordinalBuilder.append("rd"); 
     default: ordinalBuilder.append("th"); 
    } 
    ordinalBuilder.append("</sup>"); 
    return ordinalBuilder.toString(); 
} 

此打印2<sup>ndrdth</sup>當我通過在「2」,我試圖改變建設者緩衝,但相同的反應..可這是一個bug,或我做一些錯了嗎?

+3

通過內聯switch語句不會獲得任何結果,您應該將'getOrdinal'方法分開並讓代碼調用它。嘗試將11,12或13傳遞給您的代碼。還有另一個你創建的bug。 –

+1

我希望我可以給@TimBender更多+1。這個問題是貨物崇拜節目的定義。 – CanSpice

+0

R T F M。 。 。 。 。 – dokaspar

回答

33

這是您的代碼中的錯誤。你忘了在後break每個case

switch (day % 10) { 
    case 1: ordinalBuilder.append("st"); break; 
    case 2: ordinalBuilder.append("nd"); break; 
    case 3: ordinalBuilder.append("rd"); break; 
    default: ordinalBuilder.append("th"); break; 
} 
9

你需要在每一個開關的情況下添加一個「破」的語句。 它之前是有效的,因爲您從方法返回...

3

第一個版本在繼續之前在case語句中返回。第二個版本需要休息;語句來獲得相同的行爲。

18

我沒有在這裏看到任何錯誤,至少不是語言的工作方式。按照設計,switch語句的行爲是它將開始在與參數匹配的case標籤處執行語句,然後繼續,直到塊結束。所以

switch (x) { 
    case 1: 
     // do thing 1 
    case 2: 
     // do thing 2 
    case 3: 
     // do thing 3 
    default: 
     // do nothing 
} 

會做兩件事2和3,如果x爲2,將做的事情1,2,3,如果x爲1

爲了得到你可能尋找的行爲,結束每個casebreak

switch (x) { 
    case 1: 
     // do thing 1 
     break; 
    case 2: 
     // do thing 2 
     break; 
    case 3: 
     // do thing 3 
     break; 
    default: 
     // do nothing 
     break; 
} 

(嚴格地說break在最後是不必要的,但我常常把它放在出於習慣)。

的原因你沒有在第一個代碼示例這個問題是return就像是一個超級break:它爲break,即switch塊內結束執行同樣的效果,但它也結束執行整個方法。

6

「break」聲明將這些情況彼此分開,以便在特定情況下執行聲明,只要結束就立即破例。

如果你不使用break,編譯器認爲它可以繼續執行所有的情況直到程序結束。

相關問題