1. 程式人生 > >Java流程控制的陷阱——switch語句和標籤陷阱

Java流程控制的陷阱——switch語句和標籤陷阱

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會把這個字串分解成以下兩個部分:
  1. http::合法的識別符號後緊跟英文冒號,這是一個標籤。
  2. //www.baidu.com:雙斜線後的內容是註釋。