switch 语句
与 if-then 和 if-then-else 语句不通, switch语句可以有一定数量的可能执行路径。 switch 可以对 byte, short, char, 以及 intp基本数据类型使用. 同样可以对枚举类型使用 (参考 Enum Types), 字符串 String 类使用, 以及基本数据类型的包装类: Character,Byte, Short, 和 Integer (参考 Numbers and Strings).
以下的代码示例中 SwitchDemo, 声明了一个名为mongth的int。代码使用switch语句,根据month的值显示出月份的名字.
|
|
本例中, August 被输出.
switch语句的代码体也叫做 switch blocks (switch代码块). switch 代码块中的语句可以用一个或者多个case或者 default标签分类。switch语句运算表达式的值,然后执行匹配的case标签后的所有语句。你同样可以使用if-then-else语句实现以上代码的功能:
|
|
决定使用if-then-else语句还是switch语句取决于可读性以及语句所要测试的表达式。 if-then-else 语句可以用来检验基于值的范围或者条件的表达式,switch语句可以用来检验基于整数,枚举值,以及字符串String对象。
另外一个有趣的点时break语句.每一个break语句终结闭合的 switch 语句,控制流程继续跟随switch代码块的下一语句。break语句时必须的,如果为没有break语句,switch代码块 将会fall through跌穿(整段垮掉):所有匹配的case标签之后的语句都会按照顺序执行,不管随后的case标签后的表达式是否匹配,直到遇见一个break语句。下面的程序 SwitchDemoFallThrough 展示了一个争端垮掉的 switch代码块. 程序显示了整数对应的月份以及一年当中随后的月份:
|
|
代码输出结果如下:
|
|
技术上来说,最后一个break并不时必须的因为流程执行跌出switch语句。推荐使用一个break语句,这样可以使修改代码更加容易并且不容出错。default部分代码处理么有被任何一个case标签表明的其他任何值。
以下的示例代码中 SwitchDemo2, 展示了如何在语句中使用多个case标签,代码计算指定月份的天数:
|
|
以下为代码的输出:
|
|
在switch语句中使用字符串
Java SE 7以及之后的版本中,你可以在switch语句的表达式中使用字符串String对象。以下代码, StringSwitchDemo,根据字符串month的String值显示出对应月份的数字:
|
|
代码的输出结果为 8.
switch 表达式的String 值 与case标签中对应的值进行比较,就像使用 String.equals 方法。为了使StringSwitchDemo 可以接受所有忽略大小写的月份,month被转换为小写形式。(通过 toLowerCase 方法), 并且case标签中对应的字符串值也全部为小写。
注意: 本例中,检查了month的值是否为null,确保任何switch语句中的任何表达式值不为null,方式抛NullPointerException 空指针异常.