本文主要说一说关于switch case语句用法及注意事项,应对面试官的提问。希望可以帮助那些对switch存在错误和各种细节问题的“码友”。
switch-case注意事项
switch(A),括号中A的取值只能是整型或者可以转换为整型的数值类型,比如byte、short、int、char、还有枚举;需要强调的是:long和String类型是不能作用在switch语句上的。注意的是在JDK1.7之后,switch(A),括号中A的取值也支持String了。
语法case B:C,case是常量表达式,也就是说B的取值只能是常量(需要定义一个final型的常量)或者int、byte、short、char、String(比如1、2、3、200、yoodb等),case后的语句可以不用大括号,也就是说C不需要使用大括号;default没有符合的case就执行它,default并不是必须的。
switch-case语句格式如下:
switch(变量){
case 变量值1:
//;
break;
case 变量值2:
//...;
break;
...
case default:
//...;
break;
}
案例一:若未找到,则执行默认的case
int i = 6;
switch(i){
case 0:
System.out.print("0");break;
case 1:
System.out.print("1");break;
case 2:
System.out.print("2");break;
default:
System.out.print("default");break;
}
运行结果输出:default
案例二:当每一个case都不存在break时,匹配成功后,从当前case开始,依次返回后续所有case的返回值。
int i = 2;
switch(i){
case 0:
System.out.print("0");
case 1:
System.out.print("1");
case 2:
System.out.print("2");
default:
System.out.print("default");
}
运行结果输出:2 default
案例三:当每一个case都不存在break时,JVM并不会顺序输出每一个case对应的返回值,而是继续匹配,匹配不成功则返回默认case的值。
int i = 6;
switch(i){
case 0:
System.out.print("0");
case 1:
System.out.print("1");
case 2:
System.out.print("2");
default:
System.out.print("default");
}
运行结果输出:default
案例四:若当前匹配成功case但不存在break时,则从当前case开始,依次返回后续case的返回值,直至遇到break,跳出判断。
int i = 2;
switch(i){
case 0:
System.out.print("0");
case 1:
System.out.print("1");
case 2:
System.out.print("2");
case 3:
System.out.print("3");break;
default:
System.out.print("default");
}
运行结果输出:2 3
解决问题
大家看下面的程序段,具体代码如下:
public class TestSwitch {
public static void main(String[] args){
byte a = 11;
switch(a){// C
case 11 : System.out.println(" 11 "); break;
case 225 : System.out.println(" 11 "); break;// D
}
}
}
该代码正确吗?答案是否定的。虽然C处byte类型的a值可以存在switch中,但是在D处case的值是225时,大小超出了byte的最大值范围,导致出现错误。
个人总结
switch case执行过程中,一定是先进行匹配,匹配成功后返回当前case的值,再根据是否存在break判断是否继续输出,或者跳出判断,注意的是case B:C,B的取值只能是常量,不能是变量,否则JVM报错。
推荐阅读
关注微信公众号“Java精选”(w_z90110),回复关键字领取资料:如Hadoop,Dubbo,CAS源码等等,免费领取资料视频和项目。
涵盖:程序人生、搞笑视频、算法与数据结构、黑客技术与网络安全、前端开发、Java、Python、Redis缓存、Spring源码、各大主流框架、Web开发、大数据技术、Storm、Hadoop、MapReduce、Spark、elasticsearch、单点登录统一认证、分布式框架、集群、安卓开发、iOS开发、C/C++、.NET、Linux、Mysql、Oracle、NoSQL非关系型数据库、运维等。