Java流程控制的陷阱

文章目录

  • 1. switch中break的作用
  • 2. switch支持的数据类型
  • 3. else隐含的条件
  • 4. 省略花括号的陷阱
  • 5. for循环的结构
  • 6. 使用标签跳出双层for循环

流程控制三种:顺序结构、分支结构、循环结构
分支机构两种:if语句、switch语句
循环结构:while循环、do while循环、for循环、foreach循环

1. switch中break的作用

break用来终止执行,而case匹配一旦匹配到就不再判断之后的case条件、default是否匹配

case标签的条件值不能重复,否则会报错

Java流程控制的陷阱_第1张图片

case 语句中如果不带break,匹配到一个case后,下面的不再匹配,都会执行,除非遇到break

情况1:完全没有break语句,那么从匹配的case块开始,后面的case块、default块代码都会执行

Java流程控制的陷阱_第2张图片

情况2:后面的case块有break,整个switch块结束

Java流程控制的陷阱_第3张图片

使用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("老年人");
        }
    }

打印执行

Java流程控制的陷阱_第4张图片

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("老年人");
        }
    }

打印执行

Java流程控制的陷阱_第5张图片

正确写法

    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("青年人");
        }
    }

打印执行

Java流程控制的陷阱_第6张图片

因为上面代码等同于

    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("青年人");
        }
    }

打印执行

Java流程控制的陷阱_第7张图片

总结

  • 因为else总是先排除了之前的情况,所有if else每个分支都是互斥的,只可能走一个分支
  • 所以:先处理范围小的条件,再处理范围大的条件

4. 省略花括号的陷阱

如果if语句、while语句、for语句之后没有紧跟花括号,那么它们的作用范围到该语句之后的第一个分号结束

示例1:if 有花括号

Java流程控制的陷阱_第8张图片

示例1:if 无花括号

Java流程控制的陷阱_第9张图片

示例2:while有花括号

Java流程控制的陷阱_第10张图片

示例2:while无花括号:造成死循环

Java流程控制的陷阱_第11张图片

另:当循环体只有一条局部变量定义语句时,仍然不可以省略循环体的花括号

Java流程控制的陷阱_第12张图片

加上花括号就不报错了

Java流程控制的陷阱_第13张图片

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);
        }
    }
}

打印执行

Java流程控制的陷阱_第14张图片

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循环

Java流程控制的陷阱_第15张图片

使用标签跳出双层for循环

跳出外层for循环

Java流程控制的陷阱_第16张图片

跳出内层for循环,跟break不加标签效果一样

Java流程控制的陷阱_第17张图片

你可能感兴趣的:(Java基础知识,java,开发语言)