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

来源:互联网 发布:无线网卡能看网络电视 编辑:程序博客网 时间:2024/05/06 16:22

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.comSystem.out.println(name + "的体重大于60");}}}
输出结果为:
张三的体重大于60
       编译和运行上面的程序发现没有任何问题,对于Java而言,它并不知道http://www.baidu.com是一个网址,Java会把这个字符串分解成以下两个部分:
  1. http::合法的标识符后紧跟英文冒号,这是一个标签。
  2. //www.baidu.com:双斜线后的内容是注释。



1 0
原创粉丝点击