说明
- Java的switch语句块可以用于多个分支的判断执行。
- 每个case分支执行完后,要么退出方法体(用return语句)、要么退出switch语句块(用break语句)、要么继续往下执行。
- 但如果一个case执行完后,要继续执行下一个case,一定要在本case执行完,下一个case执行前,加上注释,注明为什么要继续往下执行。因为通过注释的过程,就表示作者不是忘记加break或者return了,而是考虑到往下继续执行的合理性了。如果不加注释,是否忘记了就难以判断了,过了一段时间,可能连作者本人也回忆不起来为什么不加break或者return了,要再花时间去研究逻辑。
- 如果一个case语句块执行完而后面没有加break或者return语句,会继续往下执行后面的case语句块,不会再判断switch后面括号中的条件。
- 在一个switch语句块内,要在最后包含一个default语句块,哪怕default语句块中没有任何代码。
- switch(expression):其中expression称为选择表达式,它的值必须是char、byte,、short、int、Character、Byte、Short、Integer、String、enum中的一种,否则会编译报错。
- 如果 switch(expression)语句中选择表达式expression的值是null,那么会抛出一个NullPointerException异常,switch语句块中的每个case都不会执行。
示例
每个case执行完都有break语句
package com.thb;public class Demo1 {public static void main(String[] args) {int mark = 1;switch (mark) {case 1:System.out.println("enter branch one");break;case 2:System.out.println("enter branch two");break;case 3:System.out.println("enter branch three");break;default:System.out.println("enter branch default");break;}}
}
运行输出:
enter branch one
case执行完忘了加break语句,也没有注释说明
package com.thb;
public class Demo1 {public static void main(String[] args) {int mark = 1;switch (mark) {case 1:System.out.println("enter branch one"); case 2:System.out.println("enter branch two"); case 3:System.out.println("enter branch three"); default:System.out.println("enter branch default");break;}}
}
运行输出:
enter branch one
enter branch two
enter branch three
enter branch default
从输出可以看出,开始判断的时候第一个分支满足条件,执行了该case语句块,但因为忘记加break或者return语句了,继续往下执行,看起来应该与作者的本意不符了。
switch(expression)语句中选择表达式expression的值是null,会抛出一个NullPointerException异常
package com.thb;public class Demo1 {public void process(String str) {switch (str) {// 这个分支肯定不会进来。因为如果str是null,那么会抛出NullPointerExceptioncase "null":System.out.println("enter branch null");break;case "one":System.out.println("enter branch one");break;case "two":System.out.println("enter branch two");break;default:System.out.println("enter branch default");break;} }public static void main(String[] args) {Demo1 demo = new Demo1();String str = null;demo.process(str);}
}
运行输出:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.hashCode()" because "str" is nullat com.thb.Demo1.process(Demo1.java:7)at com.thb.Demo1.main(Demo1.java:26)
如果switch(expression)语句中选择表达式expression的类型是String,程序中要先进行null判断
package com.thb;public class Demo1 {public void process(String str) throws Exception {if (str == null) {throw new Exception("illegal input");}switch (str) {case "one":System.out.println("enter branch one");break;case "two":System.out.println("enter branch two");break;default:System.out.println("enter branch default");break;} }public static void main(String[] args) {Demo1 demo = new Demo1();String str = null;try {demo.process(str);} catch (Exception e) { e.printStackTrace();}}
}
运行输出:
java.lang.Exception: illegal inputat com.thb.Demo1.process(Demo1.java:7)at com.thb.Demo1.main(Demo1.java:27)
如果switch(expression)语句中选择表达式expression的类型是long,编译报错
case语句执行完后继续往后执行,但加上了明确的注释说明
package com.thb;public class Demo1 {private DemoState state;public Demo1() {this.state = DemoState.BEGIN;}public DemoState getState() {return this.state;}public void setState(DemoState state) {this.state = state;}public void process(DemoState state) {switch (getState()) {case BEGIN:System.out.println("enter BEGIN state");setState(DemoState.MIDDLE);// 继续往下执行,下一个状态是MIDDLEcase MIDDLE:System.out.println("enter MIDDLE state");setState(DemoState.END);// 继续往下执行,下一个状态是ENDcase END:System.out.println("enter END state"); break;default:throw new Error();}}public static void main(String[] args) {Demo1 demo = new Demo1();demo.process(DemoState.BEGIN);}
}
运行输出:
enter BEGIN state
enter MIDDLE state
enter END state