先看一段代碼:
public class Test{ public static void main(String[] args){ System.out.println("2 = "+ toNumberCase(2)); } } public static String toNumberCase(int n){ String str = ""; switch(n){ case 0: str = "我是0"; case 1: str = "我是1"; case 2: str = "我是2"; case 3: str = "我是3"; case 4: str = "我是4"; case 5: str = "我是5"; case 6: str = "我是6"; case 7: str = "我是7"; case 8: str = "我是8"; case 9: str = "我是9"; } return str; }
結果是 "2 = 我是2" ?其實不是,結果是
先來分析一下:
由於每個case語句后面少加了break關鍵字。程序從”case 2"后面的語句開始執行,直到找到break語句結束,可惜的是我們的程序中沒有break語句,
於是在程序執行的過程中,str的賦值語句會執行多次,從等於"我是0"、等於"我是1”...等於"我是9",Switch語句執行結束了。於是結果就是如此了。
結論:switch-case語句,如果在每個case語句后面少加了break關鍵字。程序從該case分支繼續執行下一個分支,直到遇見break后或執行完最后一個分支,switch語句執行結束。記住在case語句后面隨手寫上break語句,養成良好的習慣。
PS:對於此類問題,還有一個簡單的解決辦法:修改Eclipse的警告級別。Performaces->Java->Compiler->Errors/Warnings->Potential Programming->problems,然后修改'switch' case fall-through為Error級別,你如果沒有在case語句中加入break,Eclipse會直接報錯。
補充:defalut放在不同位置,對結果的影響
先看幾個例子:
例子1:
package com.test; public class testbreak { public static void main(String[] args) { System.out.println("10 = "+ toNumberCase(10)); } public static String toNumberCase(int n){ String str = ""; switch(n){ default : str = "我是default"; case 0: str = "我是0"; break; case 1: str = "我是1"; break; case 2: str = "我是2"; break; case 3: str = "我是3"; break; case 4: str = "我是4"; break; case 5: str = "我是5"; break; case 6: str = "我是6"; break; case 7: str = "我是7"; break; case 8: str = "我是8"; break; case 9: str = "我是9"; break; } return str; } }
結果:
例子2:
package com.test; public class testbreak { public static void main(String[] args) { System.out.println("10 = "+ toNumberCase(10)); } public static String toNumberCase(int n){ String str = ""; switch(n){ case 0: str = "我是0"; break; case 1: str = "我是1"; break; case 2: str = "我是2"; break; case 3: str = "我是3"; break; case 4: str = "我是4"; break; default : str = "我是default"; case 5: str = "我是5"; break; case 6: str = "我是6"; break; case 7: str = "我是7"; break; case 8: str = "我是8"; break; case 9: str = "我是9"; break; } return str; } }
結果:
例子3:
package com.test; public class testbreak { public static void main(String[] args) { System.out.println("10 = "+ toNumberCase(10)); } public static String toNumberCase(int n){ String str = ""; switch(n){ case 0: str = "我是0"; break; case 1: str = "我是1"; break; case 2: str = "我是2"; break; case 3: str = "我是3"; break; case 4: str = "我是4"; break; case 5: str = "我是5"; break; case 6: str = "我是6"; break; case 7: str = "我是7"; break; case 8: str = "我是8"; break; case 9: str = "我是9"; break; default : str = "我是default"; } return str; } }
結果:
前3個例子,我把default放在不同的位置, 但是沒有加break
接下來再看幾個例子:
例子4:
package com.test; public class testbreak { public static void main(String[] args) { System.out.println("10 = "+ toNumberCase(10)); } public static String toNumberCase(int n){ String str = ""; switch(n){ default : str = "我是default"; break; case 0: str = "我是0"; break; case 1: str = "我是1"; break; case 2: str = "我是2"; break; case 3: str = "我是3"; break; case 4: str = "我是4"; break; case 5: str = "我是5"; break; case 6: str = "我是6"; break; case 7: str = "我是7"; break; case 8: str = "我是8"; break; case 9: str = "我是9"; break; } return str; } }
結果:
例子5:
package com.test; public class testbreak { public static void main(String[] args) { System.out.println("10 = "+ toNumberCase(10)); } public static String toNumberCase(int n){ String str = ""; switch(n){ case 0: str = "我是0"; break; case 1: str = "我是1"; break; case 2: str = "我是2"; break; case 3: str = "我是3"; break; case 4: str = "我是4"; break; default : str = "我是default"; break; case 5: str = "我是5"; break; case 6: str = "我是6"; break; case 7: str = "我是7"; break; case 8: str = "我是8"; break; case 9: str = "我是9"; break; } return str; } }
結果:
例子6:
package com.test; public class testbreak { public static void main(String[] args) { System.out.println("10 = "+ toNumberCase(10)); } public static String toNumberCase(int n){ String str = ""; switch(n){ case 0: str = "我是0"; break; case 1: str = "我是1"; break; case 2: str = "我是2"; break; case 3: str = "我是3"; break; case 4: str = "我是4"; break; case 5: str = "我是5"; break; case 6: str = "我是6"; break; case 7: str = "我是7"; break; case 8: str = "我是8"; break; case 9: str = "我是9"; break; default : str = "我是default"; break; } return str; } }
結果:
再看這3個例子,每個都加break
總結:
基礎邏輯都是:default的運用,是當switch語句里,所有的case語句都不滿足條件時,則執行default語句
在這里我們要分幾種情況討論:
default在switch開頭:
若所有case都不滿足條件,則執行default語句,並執行default語句之后的case語句,直到break或結束
default在switch中間:(同上)
若所有case都不滿足條件,則執行default語句,並執行default語句之后的case語句,直到break或結束
default在switch末尾:
若所有case語句都不滿足條件,則執行default語句,結束;若有case滿足,則執行case語句直到遇到break或switch語句結束,所以default在最后一行時break可以省略不寫(但是不建議省略,以求嚴謹)