Java流程控制的陷阱——switch语句和标签陷阱

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Never_Blue/article/details/70770451

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:双斜线后的内容是注释。



猜你喜欢

转载自blog.csdn.net/Never_Blue/article/details/70770451
今日推荐