流程控制三种:顺序结构、分支结构、循环结构
分支机构两种:if语句、switch语句
循环结构:while循环、do while循环、for循环、foreach循环
break用来终止执行,而case匹配一旦匹配到就不再判断之后的case条件、default是否匹配
case标签的条件值不能重复,否则会报错
case 语句中如果不带break,匹配到一个case后,下面的不再匹配,都会执行,除非遇到break
情况1:完全没有break语句,那么从匹配的case块开始,后面的case块、default块代码都会执行
情况2:后面的case块有break,整个switch块结束
使用javac -Xlint:fallthrough,编译器编译时switch中若缺少break会给出警告
枚举示例
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");
}
}
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("青年人");
}
}
打印执行
总结
如果if语句、while语句、for语句之后没有紧跟花括号,那么它们的作用范围到该语句之后的第一个分号结束
示例1:if 有花括号
示例1:if 无花括号
示例2:while有花括号
示例2:while无花括号:造成死循环
另:当循环体只有一条局部变量定义语句时,仍然不可以省略循环体的花括号
加上花括号就不报错了
示例
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);
}
}
}
打印执行
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不加标签效果一样