Java之戳中痛点 - (5)switch语句break不能忘以及default不同位置的用法
先看一段代码:
public class Test{
public static void main(String[] args){
System.out.println("2 = "+ toNumberCase());
}
} public static String toNumberCase(int n){
String str = "";
switch(n){
case : str = "我是0";
case : str = "我是1";
case : str = "我是2";
case : str = "我是3";
case : str = "我是4";
case : str = "我是5";
case : str = "我是6";
case : str = "我是7";
case : str = "我是8";
case : str = "我是9";
}
return str;
}
结果是 "2 = 我是2" ?其实不是,结果是
先来分析一下:
由于每个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;
}
}
结果:
例子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;
}
}
结果:
例子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;
}
}
结果:
前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;
}
}
结果:
例子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;
}
}
结果:
例子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;
}
}
结果:
再看这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之戳中痛点 - (5)switch语句break不能忘以及default不同位置的用法的更多相关文章
- 提高java编程质量 - (五)switch语句break不能忘以及default不同位置的用法
先看一段代码: public class Test{ public static void main(String[] args){ System.)); } } public static Stri ...
- Java之戳中痛点 - (4)i++ 和 ++i 探究原理
先看一个例子: package com.test; public class AutoIncrement { public static void main(String[] args) { int ...
- Java之戳中痛点 - (7)善用Java整型缓存池
先看一段代码: package com.test; import java.util.Scanner; public class IntegerCache { public static void m ...
- Java之戳中痛点 - (6)避免类型自动转换,例如两个整数相除得浮点数遇坑
先来看一个例子: package com.test; public class calculate { /** * 光速30万公里/秒 */ public static final int LIGHT ...
- Java之戳中痛点 - (1)易变业务使用脚本语言编写
脚本语言的3大特征: 1.灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型:2.便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务3.简单:脚本语言语法比 ...
- Java之戳中痛点 - (8)synchronized深度解析
概览: 简介:作用.地位.不控制并发的影响 用法:对象锁和类锁 多线程访问同步方法的7种情况 性质:可重入.不可中断 原理:加解锁原理.可重入原理.可见性原理 缺陷:效率低.不够灵活.无法预判是否成功 ...
- Java之戳中痛点 - (2)取余用偶判断,不要用奇判断
取余判断原则:取余用偶判断,不要用奇判断 先看一个 程序: package com.test; import java.util.Scanner; public class t1 { public s ...
- Java之戳中痛点 - (3)三目运算符的两个操作数类型尽量一致
先看一个例子: package com.test; public class TernaryOperator { public static void main(String[] args) { in ...
- Java基础学习中一些词语和语句的使用
在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...
随机推荐
- PHP.44-TP框架商城应用实例-后台19-权限管理-RBAC需求分析
RBAC:Role Based Access Control:基于角色的访问控制 需求分析:[类似效果如下图] 1.权限,角色,管理员 2.权限管理[无限级] 注意:权限会被分配给角色,而不是给管理员 ...
- 当应用出现 access violation at address in module时
Delphi2010和XE10,midas是不同的版本,之前开发的两个系统,基于不同的Delphi版本,经常出现access violation at address in module错误.特别是当 ...
- 「日常训练」Soldier and Badges (CFR304D2B)
题意 (Codeforces 546B) 问对一个序列最少需要增减几个1能使其彼此不同. 分析 模拟处理.需要注意的是,尽管题目中说了an<=3000,问题是,如果一群a全是3000呢(滑稽), ...
- (原)UnrealObj篇 : 反射获取Struct类型
@Author: 白袍小道 转载请说明 案例一:蓝图传递任意Struct ,导出struct的相关属性 相关: 1.宏:DECLARE_FUNCTION: 此宏用于在自动生成的样板代码中声明t ...
- HTML如何给table添加滚动条
HTML如何给table添加滚动条 要给table添加滚动条其实很简单,主要是给table放到一个div里去,然后再设置div显示滚动条即可.示例代码如下所示: <!--div比table大小要 ...
- PAT 1084 外观数列
https://pintia.cn/problem-sets/994805260223102976/problems/994805260583813120 外观数列是指具有以下特点的整数序列: d, ...
- vue2.0中vue-router使用总结
#在vue-cli所创建的项目中使用 进入到项目的目录后使用 npm install vue-router --save 安装vue-router,同时保存在webpack.Json配置文件中,然 ...
- docker/qemu中是如何对设备管理的
文件系统中包括实际的磁盘中可读可写的. 容器中看到的设备是啥子呢?--docker qemu也是一样,在qemu中添加一个设备的物理意义是啥子嘛 其实设备也没啥好新奇的,不就是一个普通的文件么,然后在 ...
- BZOJ4557 JLOI2016侦察守卫(树形dp)
下称放置守卫的点为监控点.设f[i][j]为i子树中深度最大的未被监视点与i的距离不超过j时的最小代价,g[i][j]为i子树中距离i最近的监控点与i的距离不超过j且i子树内点全部被监视时的最小代价. ...
- BZOJ4563 HAOI2016放棋子(高精度)
没看清题还以为是要求数最大匹配数量……注意到任意障碍不在同一行同一列,且恰好有n个障碍,不妨通过交换列使得第i行第i列均有障碍.那么就是个错排了.居然wa了一发简直没救. #include<io ...