说明
- 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,那么会抛出NullPointerException
case "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 null
at 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 input
at 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);
// 继续往下执行,下一个状态是MIDDLE
case MIDDLE:
System.out.println("enter MIDDLE state");
setState(DemoState.END);
// 继续往下执行,下一个状态是END
case 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