Java流程控制的陷阱
2024-01-07 17:23:53
流程控制三种:顺序结构、分支结构、循环结构
分支机构两种:if语句、switch语句
循环结构:while循环、do while循环、for循环、foreach循环
1. switch中break的作用
break用来终止执行,而case匹配一旦匹配到就不再判断之后的case条件、default是否匹配
case标签的条件值不能重复,否则会报错
case 语句中如果不带break,匹配到一个case后,下面的不再匹配,都会执行,除非遇到break
情况1:完全没有break语句,那么从匹配的case块开始,后面的case块、default块代码都会执行
情况2:后面的case块有break,整个switch块结束
使用javac -Xlint:fallthrough,编译器编译时switch中若缺少break会给出警告
2. switch支持的数据类型
- byte
- short
- int
- char
- enum
- String
- 上面基础类型的包装类也是支持的
枚举示例
public static void testSwitch() {
YesNoEnum yesNoEnum = YesNoEnum.NO;
switch(yesNoEnum) {
case NO:
System.out.println("NO");
break;
case YES:
System.out.println("YES");
break;
default:
System.out.println("default");
}
}
3. else隐含的条件
- else的字面意义是“否则”,隐含的条件是前面条件都不符合。
- else if的条件 = if显示条件 && else隐式条件(前面条件都不符合)
public static void main(String[] args) {
int age = 45;
if (age > 20) {
System.out.println("青年人");
} else if (age > 40) {
System.out.println("中年人");
} else if (age > 60) {
System.out.println("老年人");
}
}
打印执行
45岁是青年人,明显不对,上面逻辑有问题
因为上面的代码等同于下面的代码
public static void main(String[] args) {
int age = 45;
if (age > 20) {
System.out.println("青年人");
} else if (age > 40 && !(age > 20)) {
System.out.println("中年人");
} else if (age > 60 && !((age > 20) && (age > 40 && !(age > 20)))) {
System.out.println("老年人");
}
}
打印执行
正确写法
public static void main(String[] args) {
int age = 45;
if (age > 60) {
System.out.println("老年人");
} else if (age > 40) {
System.out.println("中年人");
} else if (age > 20) {
System.out.println("青年人");
}
}
打印执行
因为上面代码等同于
public static void main(String[] args) {
int age = 45;
if (age > 60) {
System.out.println("老年人");
} else if (age > 40 && !(age > 60)) {
System.out.println("中年人");
} else if (age > 20 && !(age > 60) && !(age > 40 && !(age > 60))) {
System.out.println("青年人");
}
}
打印执行
总结
- 因为else总是先排除了之前的情况,所有if else每个分支都是互斥的,只可能走一个分支
- 所以:先处理范围小的条件,再处理范围大的条件
4. 省略花括号的陷阱
如果if语句、while语句、for语句之后没有紧跟花括号,那么它们的作用范围到该语句之后的第一个分号结束
示例1:if 有花括号
示例1:if 无花括号
示例2:while有花括号
示例2:while无花括号:造成死循环
另:当循环体只有一条局部变量定义语句时,仍然不可以省略循环体的花括号
加上花括号就不报错了
5. for循环的结构
- 根据java规范,for循环里有且只能有两个分号作为分隔符
- 第一个分号之前的是初始化条件
- 两个分号中间的部分是一个返回boolean的逻辑表达式,当它返回true时for循环才会执行下一次循环
- 第二个分号之后的是循环迭代部分,每次循环结束后会执行循环迭代部分
示例
public class ForDemo {
public static void main(String[] args) {
for (int i = 0, j = 1; i < 5 && j < 20; i++, j *=2 ) {
System.out.println("2的" + i + "次方 = " + j);
}
}
}
打印执行
6. 使用标签跳出双层for循环
break只是结束所在for循环
private static void test2() {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (j == 2) {
break;
}
System.out.println("i = " + i + ", j = " + j);
}
}
}
打印执行:i值0、1、2、3、4都有,j值只有0、1,说明break只是结束了内层for循环
使用标签跳出双层for循环
跳出外层for循环
跳出内层for循环,跟break不加标签效果一样
文章来源:https://blog.csdn.net/weixin_43024834/article/details/135427615
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!