Java之戳中痛点 - (5)switch语句break不能忘以及default不同位置的用法
2017-06-13 10:24
555 查看
先看一段代码:
结果是 "2 = 我是2" ?其实不是,结果是
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/61beaca8895d2574979581e160097f02.png)
先来分析一下:
由于每个case语句后面少加了break关键字。程序从”case 2"后面的语句开始执行,直到找到break语句结束,可惜的是我们的程序中没有break语句,
于是在程序执行的过程中,str的赋值语句会执行多次,从等于"我是0"、等于"我是1”...等于"我是9",Switch语句执行结束了。于是结果就是如此了。
结论:switch-case语句,如果在每个case语句后面少加了break关键字。程序从该case分支继续执行下一个分支,直到遇见break后或执行完最后一个分支,switch语句执行结束。记住在case语句后面随手写上break语句,养成良好的习惯。
PS:对于此类问题,还有一个简单的解决办法:修改Eclipse的警告级别。Performaces->Java->Compiler->Errors/Warnings->Potential Programming->problems,然后修改'switch' case fall-through为Error级别,你如果没有在case语句中加入break,Eclipse会直接报错。
补充:defalut放在不同位置,对结果的影响
先看几个例子:
例子1:
结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/7a91abcbc4f9a3e936bef4514190397f.png)
例子2:
结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/733eeb8098fe9001e11d561c31462d43.png)
例子3:
结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/8365070a6dee9a8259eba91a65279861.png)
前3个例子,我把default放在不同的位置, 但是没有加break
接下来再看几个例子:
例子4:
结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/e403377d4038e67b48e423311f1c16f3.png)
例子5:
结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/41712e9d91bed0a91f1e72962301d7fd.png)
例子6:
结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/e036bef6cebfd9553929ca27de5b38d9.png)
再看这3个例子,每个都加break
总结:
基础逻辑都是:default的运用,是当switch语句里,所有的case语句都不满足条件时,则执行default语句
在这里我们要分几种情况讨论:
default在switch开头:
若所有case都不满足条件,则执行default语句,并执行default语句之后的case语句,直到break或结束
default在switch中间:(同上)
若所有case都不满足条件,则执行default语句,并执行default语句之后的case语句,直到break或结束
default在switch末尾:
若所有case语句都不满足条件,则执行default语句,结束;若有case满足,则执行case语句直到遇到break或switch语句结束,所以default在最后一行时break可以省略不写(但是不建议省略,以求严谨)
public class Test{ public static void main(String[] args){ System.out.println("2 = "+ toNumberCase(2)); } } public static String toNumberCase(int n){ String str = ""; switch(n){ case 0: str = "我是0"; case 1: str = "我是1"; case 2: str = "我是2"; case 3: str = "我是3"; case 4: str = "我是4"; case 5: str = "我是5"; case 6: str = "我是6"; case 7: str = "我是7"; case 8: str = "我是8"; case 9: str = "我是9"; } return str; }
结果是 "2 = 我是2" ?其实不是,结果是
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/61beaca8895d2574979581e160097f02.png)
先来分析一下:
由于每个case语句后面少加了break关键字。程序从”case 2"后面的语句开始执行,直到找到break语句结束,可惜的是我们的程序中没有break语句,
于是在程序执行的过程中,str的赋值语句会执行多次,从等于"我是0"、等于"我是1”...等于"我是9",Switch语句执行结束了。于是结果就是如此了。
结论:switch-case语句,如果在每个case语句后面少加了break关键字。程序从该case分支继续执行下一个分支,直到遇见break后或执行完最后一个分支,switch语句执行结束。记住在case语句后面随手写上break语句,养成良好的习惯。
PS:对于此类问题,还有一个简单的解决办法:修改Eclipse的警告级别。Performaces->Java->Compiler->Errors/Warnings->Potential Programming->problems,然后修改'switch' case fall-through为Error级别,你如果没有在case语句中加入break,Eclipse会直接报错。
补充:defalut放在不同位置,对结果的影响
先看几个例子:
例子1:
package com.test; public class testbreak { public static void main(String[] args) { System.out.println("10 = "+ toNumberCase(10)); } public static String toNumberCase(int n){ String str = ""; switch(n){ default : str = "我是default"; case 0: str = "我是0"; break; case 1: str = "我是1"; break; case 2: str = "我是2"; break; case 3: str = "我是3"; break; case 4: str = "我是4"; break; case 5: str = "我是5"; break; case 6: str = "我是6"; break; case 7: str = "我是7"; break; case 8: str = "我是8"; break; case 9: str = "我是9"; break; } return str; } }
结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/7a91abcbc4f9a3e936bef4514190397f.png)
例子2:
package com.test; public class testbreak { public static void main(String[] args) { System.out.println("10 = "+ toNumberCase(10)); } public static String toNumberCase(int n){ String str = ""; switch(n){ case 0: str = "我是0"; break; case 1: str = "我是1"; break; case 2: str = "我是2"; break; case 3: str = "我是3"; break; case 4: str = "我是4"; break; default : str = "我是default"; case 5: str = "我是5"; break; case 6: str = "我是6"; break; case 7: str = "我是7"; break; case 8: str = "我是8"; break; case 9: str = "我是9"; break; } return str; } }
结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/733eeb8098fe9001e11d561c31462d43.png)
例子3:
package com.test; public class testbreak { public static void main(String[] args) { System.out.println("10 = "+ toNumberCase(10)); } public static String toNumberCase(int n){ String str = ""; switch(n){ case 0: str = "我是0"; break; case 1: str = "我是1"; break; case 2: str = "我是2"; break; case 3: str = "我是3"; break; case 4: str = "我是4"; break; case 5: str = "我是5"; break; case 6: str = "我是6"; break; case 7: str = "我是7"; break; case 8: str = "我是8"; break; case 9: str = "我是9"; break; default : str = "我是default"; } return str; } }
结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/8365070a6dee9a8259eba91a65279861.png)
前3个例子,我把default放在不同的位置, 但是没有加break
接下来再看几个例子:
例子4:
package com.test; public class testbreak { public static void main(String[] args) { System.out.println("10 = "+ toNumberCase(10)); } public static String toNumberCase(int n){ String str = ""; switch(n){ default : str = "我是default"; break; case 0: str = "我是0"; break; case 1: str = "我是1"; break; case 2: str = "我是2"; break; case 3: str = "我是3"; break; case 4: str = "我是4"; break; case 5: str = "我是5"; break; case 6: str = "我是6"; break; case 7: str = "我是7"; break; case 8: str = "我是8"; break; case 9: str = "我是9"; break; } return str; } }
结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/e403377d4038e67b48e423311f1c16f3.png)
例子5:
package com.test; public class testbreak { public static void main(String[] args) { System.out.println("10 = "+ toNumberCase(10)); } public static String toNumberCase(int n){ String str = ""; switch(n){ case 0: str = "我是0"; break; case 1: str = "我是1"; break; case 2: str = "我是2"; break; case 3: str = "我是3"; break; case 4: str = "我是4"; break; default : str = "我是default"; break; case 5: str = "我是5"; break; case 6: str = "我是6"; break; case 7: str = "我是7"; break; case 8: str = "我是8"; break; case 9: str = "我是9"; break; } return str; } }
结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/41712e9d91bed0a91f1e72962301d7fd.png)
例子6:
package com.test; public class testbreak { public static void main(String[] args) { System.out.println("10 = "+ toNumberCase(10)); } public static String toNumberCase(int n){ String str = ""; switch(n){ case 0: str = "我是0"; break; case 1: str = "我是1"; break; case 2: str = "我是2"; break; case 3: str = "我是3"; break; case 4: str = "我是4"; break; case 5: str = "我是5"; break; case 6: str = "我是6"; break; case 7: str = "我是7"; break; case 8: str = "我是8"; break; case 9: str = "我是9"; break; default : str = "我是default"; break; } return str; } }
结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201808/e036bef6cebfd9553929ca27de5b38d9.png)
再看这3个例子,每个都加break
总结:
基础逻辑都是:default的运用,是当switch语句里,所有的case语句都不满足条件时,则执行default语句
在这里我们要分几种情况讨论:
default在switch开头:
若所有case都不满足条件,则执行default语句,并执行default语句之后的case语句,直到break或结束
default在switch中间:(同上)
若所有case都不满足条件,则执行default语句,并执行default语句之后的case语句,直到break或结束
default在switch末尾:
若所有case语句都不满足条件,则执行default语句,结束;若有case满足,则执行case语句直到遇到break或switch语句结束,所以default在最后一行时break可以省略不写(但是不建议省略,以求严谨)
相关文章推荐
- Java之戳中痛点 - (3)三目运算符的两个操作数类型尽量一致 Java之戳中痛点 - (4)i++ 和 ++i 探究原理 Java之戳中痛点 - (1)易变业务使用脚本语言编写 Java之戳中痛点 - (2)取余用偶判断,不要用奇判断 (5)switch语句break不能忘以及default不同位置的用法 Java之戳中痛点 - (7)善用Java整型缓存池
- java 多重switch中break的用法以及switch的查找顺序
- Java switch开关语句的break,default作用
- switch语句,case穿透,以及开头以及default可以放置位置
- java的选择结构switch和循环结构for while do while以及流程控制语句break continue return
- C++程序员学Java系列之十一:流程控制语句switch,case,break,default
- 求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
- java中的switch语句中break和continue的区别--------总算是弄明白了
- Java switch-case语句用法
- 求1+2+…+n 要求不能使用 乘 除 法、for、while、if、else、switch、case等关键字以及条件判断语句
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句
- switch case break default 判断语句
- 求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句
- java多重循环中break,conitnue以及相关标签的用法
- Interview----求 1+2+...+n, 不能用乘除法、for、while if、else、switch、case 等关键字以及条件判断语句 (A?B:C)
- 关于Switch语句中default的位置
- C语言奇思妙想:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句(A?B:C)
- 题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
- 当case后有语句时,break不能省略,在没有default的情况下,最后一个case后即使没有语句,也要加上break。
- 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句