Java流程控制的陷阱——switch語句和標籤陷阱
阿新 • • 發佈:2018-12-25
1、switch語句陷阱
switch語句是Java提供的一種重要的分支語句,它用於判斷某個表示式的值,根據不同的值執行不同的分支語句。需要指出的是,Java的switch語句限制很多,而且還有非常容易出錯的陷阱,使用時要非常的小心。
1、1 default分支
switch語句之後可以包含一個default分支。default分支並不是無條件執行的分支,執行的潛在條件是,表示式的值與前面分支的值都不相等。也就是說,在正常情況下,只有當switch語句的前面分支沒有獲得執行時,default分支才會獲得執行的機會。輸出結果為: 中public class DefaultTest { public static void main(String[] args) { char c = 'C'; switch(c) { case 'A': System.out.println("優秀"); break; case 'B': System.out.println("良好"); break; case 'C': System.out.println("中"); break; case 'D': System.out.println("及格"); break; default: System.out.println("不及格"); } } }
1、2 break語句
在case分支後的每個程式碼後都有一個break;語句,這個break;語句具有極其重要的意義:用於終止當前分支的執行體。如果某個case分支之後沒有使用break;來終止這個分支的執行體,即使使用花括號來保衛該分支的執行體也是無效的。 Java一旦找到匹配的case分支,程式就開始執行這個case分支的執行體,不在判斷與後面的case、default標籤的條件是否匹配,除非遇到break;才會結束執行體。輸出結果為: 中public class BreakTest { public static void main(String[] args) { char c = 'C'; switch(c) { case 'A': { System.out.println("優秀"); } case 'B': { System.out.println("良好"); } case 'C': { System.out.println("中"); } case 'D': { System.out.println("及格"); } default: { System.out.println("不及格"); } } } }
及格
不及格
1、3 Java7增強的switch表示式
在Java7之前,switch語句的表示式只能有byte、short、int、char、enum5中資料型別。從Java7開始,switch表示式的型別可以是String型別,但不能是long、float、double等其他基本型別。public class SwitchTest {
public static void main(String[] args) {
int a = 5;
switch (a + 1.2 + 0.8) {
case 6:
System.out.println("結果等於6");
break;
case 7:
System.out.println("結果等於7");
break;
case 8:
System.out.println("結果等於8");
break;
default:
System.out.println("結果等於其他值");
}
}
}
上面的switch分支語句,從表面上來看應該列印“結果等於7”,但是編譯時會報錯:Cannot switch on a value of type double. Only convertible int values, strings or enum constants are permitted。這是因為a + 1.2 + 0.8表示式的型別自動提升為double型別,而switch表示式不允許使用double型別。為了讓程式輸出希望的結果,應該將switch語句改為如下所示:
switch ((int)(a + 1.2 + 0.8))
enum Season {
SPRING,SUMMER,FALL,WINTER
}
public class EnumSwitch {
public static void main(String[] args) {
Season s = Season.FALL;
switch(s) {
case SPRING:
System.out.println("春天");
break;
case SUMMER:
System.out.println("夏天");
break;
case FALL:
System.out.println("秋天");
break;
case WINTER:
System.out.println("冬天");
break;
}
}
}
輸出結果為:
秋天
值得指出的是,程式在其他地方使用enum值時,通常應該使用列舉類名作為限定,例如程式中使用Season.FALL,但在case分支中訪問列舉值時不能使用列舉類名作為限定,例如case SPRING。
2、標籤的陷阱
Java語句中的標籤通常沒有太大的作用,不過,Java語句的標籤可以與迴圈中的break、continue結合使用,讓break直接終止標籤所標識的迴圈,讓continue語句忽略標籤所標識的迴圈的剩下語句。從這個意義上來說,Java程式中的標籤只有放在迴圈之前才具有實際意義,但是實際上,Java的標籤可以放在程式的任何位置,即使它沒有實際的意義。public class URLTest {
public static void main(String[] args) {
String name = "張三";
double weight = 65.5;
if ( weight > 60 ) {
http://www.baidu.com
System.out.println(name + "的體重大於60");
}
}
}
輸出結果為:
張三的體重大於60
編譯和執行上面的程式發現沒有任何問題,對於Java而言,它並不知道http://www.baidu.com是一個網址,Java會把這個字串分解成以下兩個部分:
- http::合法的識別符號後緊跟英文冒號,這是一個標籤。
- //www.baidu.com:雙斜線後的內容是註釋。