与if-then和if-then-else语句不同,switch语句可以包含多条可能的执行路径。switch语句通常和byte、short、char、int等基本数据类型一起使用,也会和枚举类型(见第4章)、String类和由某些基本数据类型组成的特殊类(character、byte、short和integer等,见第8章)一起使用。
下述SwitchDemo程序声明int类型的变量month,其值表示月份。它根据month的值使用switch语句显示月份的名称。
其输出结果为August。
switch语句的主体叫switch块。switch块中的语句可以用一个case标签或多个case标签或default标签来标记。switch语句计算其表达式,并执行匹配的case标签后的所有语句。
该程序的功能也可以用if-then-else语句实现:
选择if-then-else语句还是switch语句,取决于程序的可读性和语句的条件表达式。if-then-else语句可以根据值或条件的范围进行条件判断,而switch语句只能根据单个值(如枚举值、String对象等)进行条件判断。
需要注意的是break语句,它让程序跳出switch语句,继续执行switch块后的第一条语句。
break语句是必需的。如果没有break语句,switch 块中的语句就会失效:它会顺序执行匹配case标签之后的所有语句,不管是否是表达式的子case标签,直到遇到break语句。程序SwitchDemoFallThrough就是这样一个例子,它输出匹配月份及之后的月份。
程序输出如下:
就技术而言,最后的break不是必需的,因为控制流会跳出switch语句。但建议使用break,因为这样有助于更改代码,而且不容易犯错误。default部分处理所有不能用case部分显式处理的值。
下述SwitchDemo2程序说明语句如何包含多个case标签,其功能为计算特定月份的天数。
输出结果如下:
在switch语句中使用String对象
Java SE 7及更高版本支持在switch语句的表达式中使用String对象。下面的程序StringSwitchDemo会根据月份的String值来显示月份的数值:
程序输出8。
switch表达式中的String对象与case标签相关联的表达式相比较,就像使用String.equals方法一样。要让StringSwitchDemo程序接收任意大小写的月份,只需将输入的月份名称转换成小写(使用toLowerCase方法),并将case标签关联的所有字符串都改成小写即可。
注意 这个例子测试switch语句中的表达式是否为null。要确保任意switch语句中的表达式都不为null,以免抛出空指针异常(NullPointerException)。