在Java12之前,switch的语法如下:
switch(表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
…
default:
语句体n+1;
break;
}
从Java12开始,switch语句升级为更简洁的表达式语法,使用类似模式匹配的方法,保证只有一条路径被执行,并且不需要break语句。看我下边这段代码:
switch (choise) {
case 1->{
switch(random) {
case 1->System.out.println(“剪刀”+“PK”+“剪刀”+“平局”);
case 2->System.out.println(“剪刀”+“PK”+“石头”+“你输啦”);
default->System.out.println(“剪刀”+“PK”+“布”+“你赢啦”);
}这里
}
case 2->{
switch(random) {
case 1->System.out.println(“石头”+“PK”+“剪刀”+“你赢啦”);
case 2->System.out.println(“石头”+“PK”+“石头”+“平局”);
default->System.out.println(“石头”+“PK”+“布”+“你输啦”);
}这里
}
default->{
switch(random) {
case 1->System.out.println(“布”+“PK”+“剪刀”+“你输啦”);
case 2->System.out.println(“布”+“PK”+“石头”+“你赢啦”);
default->System.out.println(“布”+“PK”+“布”+“平局”);
}这里
}
}
我安装的eclipse版本是Version: 2020-03 (4.15.0),以上代码在其执行结果如下(此时choise=1,random=3)
剪刀PK布你赢啦
石头PK布你输啦
布PK布平局
很明显出现了穿透。当然,这样的穿透问题在控制台编译运行代码时是不会出现的。显然,这是Eclipse本身的bug。
目前解决方法是将每个嵌套的switch的default后边的语句体用花括号括起来或者在上边代码标注“这里”的地方加上“break;"或者“;”,即可解决。