案例:春夏秋冬

需求:
      一年有十二个月,分属于春夏秋冬四个季节,键盘录入一个月份
请用程序判断这个月分属于什么季节?
	 春:3,4,5
	 夏:6,7,8
	 秋:9,10,11
	 冬:1,2,12

在学习过switch语句的基本用法后,我们可以轻易的写出基础的代码,如下:

switch(i){
			case 3:
				System.out.println("春");
				break;
			case 4:
				System.out.println("春");
				break;
			case 5:
				System.out.println("春");
				break;
			case 6:
				System.out.println("夏");
				break;
			case 7:
				System.out.println("夏");
				break;
			case 8:
				System.out.println("夏");
				break;
			case 9:
				System.out.println("秋");
				break;
			case 10:
				System.out.println("秋");
				break;
			case 11:
				System.out.println("秋");
				break;
			case 12:
				System.out.println("冬");
				break;
			case 1:
				System.out.println("冬");
				break;
			case 2:
				System.out.println("冬");
				break;
			default:
				System.out.println("您输入的月份有误");
		}

但是这样写实在是太过繁琐,因此我就想到能否用更简单的方式呢?于是,我开始了改造代码的第一步:
·既然我们要判断春夏秋冬,只需要判断我们输入的数字i是否属于各个季节三个月份之一,于是我想到之前学过的二元运算符“||”。于是,代码被我改成了这个样子:

switch(i){
			case (3 || 4 || 5):
				System.out.println("春");
				break;
			case (6 || 7 || 8):
				System.out.println("夏");
				break;
			case (9 || 10 || 11):
				System.out.println("秋");
				break;
			case (12 || 1 || 2):
				System.out.println("冬");
				break;
			
			default:
				System.out.println("您输入的月份有误");
		}

看起来完美,没有错误,是不是?但是让我们编译一下,出现了下面的问题

二元运算符 ‘||’ 的操作数类型错误?哪里错了呢?回想一下之前的代码,我们在使用二元运算符“||”时,连接的都是一个表达式,于是我们把代码改成这个样子试一试呢?

switch(i){
			case (i == 3 || i == 4 ||i ==  5):
				System.out.println("春");
				break;
				...

编译运行后,我们发现它又出现了错误,如下:


不兼容的类型:boolean无法转换为int。于是我们又想到二元运算符“||”运算过后,我们得到的是一个布尔类型的值,而我们switch()中与之对比的值i是int型,因此无法比较。那如果我们将switch()中的值也改为布尔类型呢?如下

switch(true){
			case (i == 3 || i == 4 ||i ==  5):
				System.out.println("春");
				break;

编译运行后,我们发现依旧是出现了错误,如下:

还是不可以,究竟是哪里错了呢?我们翻看一下switch语句的格式及其说明:
switch语句

格式:
switch(表达式){
	case 值1:
		语句体1;
		break;
	case 值2
		语句体2;
		break;
		
	...
	default:
		语句体n+1;
		[break];//可选
		
格式说明:
·表达式:取值为byte\short\int\char,JDK5以后可以是枚举,JDK7以后可以是String
·case:后面跟的值是要跟表达式比较的值
·break:表示中断、结束的意思,用来结束switch的语句
·default:表示所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似

我们发现switch()中的表达式取值不可为布尔类型,因此我们从最开始的思路导致了后面问题的出现。

那么,我们该如何才能简化这段switch代码呢?
我们用到了switch语句中的case穿透,代码如下:

//case穿透
		switch(i){
			case 3:
			case 4:
			case 5:
				System.out.println("春");
				break;
			case 6:
			case 7:
			case 8:
				System.out.println("夏");
				break;
			case 9:
			case 10:
			case 11:
				System.out.println("秋");
				break;
			case 12:
			case 1:
			case 2:
				System.out.println("冬");
				break;
			default:
				System.out.println("您输入的月份有误");
		}

什么是case穿透呢?
·在switch语句中,如果case控制的语句体后面不写break,将出现穿透现象,在不判断下一个case值的情况下,向下运行,直到遇到break,或者整体switch语句结束。

综上,我们完成了switch练习案例:春夏秋冬的代码编写,并解决了我们在过程中出现的 二元运算符“||”操作数类型错误 问题。

更多推荐

Java新手问题 | swich语句中出现的问题 | 二元运算符“||”操作数类型错误