Java 的 swich case 执行顺序

Java 的 swich case 执行顺序

1 常量表达式

1.1 错误一


public class SwichCaseTest {

    private static final String A = new String("a");
    private static final String B = new String("b");
    private static final String C = "c";

    public static void main(String[] args) {
        String a = "b";

        switch (a) {
            case A: // A 会被标注红色下划线
                System.out.println(A);
            case B: // B 会被标注红色下划线
                System.out.println(B);
            case C:
                System.out.println(C);
            default:
                System.out.println("default");
        }

    }
}

编译错误,位置在case里边的 AB 变量会被标注红色下划线。错误如下(翻译过来的意思是需要常量字符串表达式):

constant expression required 

1.2 错误二

public class SwichCaseTest {

    private static final String A = "b";
    private static final String B = "b";
    private static final String C = "c";

    public static void main(String[] args) {
        String a = "b";

        switch (a) {
            case A: // A 会被标注红色下划线
                System.out.println(A);
            case B: // B 会被标注红色下划线
                System.out.println(B);
            case C:
                System.out.println(C);
            default:
                System.out.println("default");
        }

    }
}

编译错误,位置在case里边的 AB 变量会被标注红色下划线。错误如下(翻译过来的意思是 case标签重复):

duplicate label 'b'

1.3 错误三

 public class SwichCaseTest {

    private static String A = "a";
    private static final String B = "b";
    private static final String C = "c";

    public static void main(String[] args) {
        String a = "b";

        switch (a) {
            case A: // A 会被标注红色下划线
                System.out.println(A);
            case B:
                System.out.println(B);
            case C:
                System.out.println(C);
            default:
                System.out.println("default");
        }

    }
}

编译错误,位置在case里边的 A 变量会被标注红色下划线。错误如下(翻译过来的意思是需要常量字符串表达式):

constant expression required 

1.4 错误四

public class SwichCaseTest {

    private static final String A = ma();
    private static final String B = "b";
    private static final String C = "c";

    public static void main(String[] args) {
        String a = "b";

        switch (a) {
            case A: // A 会被标注红色下划线
                System.out.println(A);
            case B:
                System.out.println(B);
            case C:
                System.out.println(C);
            default:
                System.out.println("default");
        }

    }

    private static String ma(){
        return "a";
    }
}

编译错误,位置在case里边的 A 变量会被标注红色下划线。错误如下(翻译过来的意思是需要常量字符串表达式):

constant expression required 

1.5 正常

public class SwichCaseTest {

    private static final String A = "a";
    private static final String B = "b";
    private static final String C = "c";

    public static void main(String[] args) {
        String a = "b";

        switch (a) {
            case A:
                System.out.println(A);
            case B:
                System.out.println(B);
            case C:
                System.out.println(C);
            default:
                System.out.println("default");
        }

    }

}

运行正常,输出如下:

b
c
default

1.6 case 表达式

public class SwichCaseTest {

    public static void main(String[] args) {

        String value = "cc";
        switch (value) {
            case "a":
                System.out.println("a");
            case "b":
                System.out.println("b");
            case "c"+"c":  // HERE
                System.out.println("c");
            default:
                System.out.println("default");
        }

    }

}

输出:

c
default

结论:

case后面只能是常量,可以是运算表达式,但一定要符合正确的类型。不能是变量,即便变量在之前进行了赋值,JVM依然会报错。

2 支持的类型

  • 基本数据类型:byte, short, char, int
  • 包装数据类型:Byte, Short, Character, Integer
  • 枚举类型:Enum
  • 字符串类型:String(JDK1.7之后 开始支持)

3 执行顺序

3.1 案例一

public class SwichCaseTest {

    public static void main(String[] args) {

        String value = "v";
        switch (value) {
            case "a":
                System.out.println("a");
            case "b":
                System.out.println("b");
            case "c":
                System.out.println("c");
            case "d":
                System.out.println("d");
            case "e":
                System.out.println("e");
            default:
                System.out.println("default");
        }

    }

}

结果:

default

结论:

当每一个case中 存在或者不存在 break时,进行顺序匹配,若未匹配成功则执行默认的 default 代码块。

3.2 案例二

public class SwichCaseTest {

    public static void main(String[] args) {

        String value = "c";
        switch (value) {
            case "a":
                System.out.println("a");
            case "b":
                System.out.println("b");
            case "c":
                System.out.println("c");
            case "d":
                System.out.println("d");
            case "e":
                System.out.println("e");
            default:
                System.out.println("default");
        }

    }

}

输出:

c
d
e
default

结论:

当每一个case都不存在break时,匹配成功后,从当前case开始,依次执行后续所有case代码块。

3.3 案例三

public class SwichCaseTest {

    public static void main(String[] args) {

        String value = "c";
        switch (value) {
            case "a":
                System.out.println("a");
            case "b":
                System.out.println("b");
            case "c":
                System.out.println("c");
            case "d":
                System.out.println("d");
                break;  //HERE
            case "e":
                System.out.println("e");
            default:
                System.out.println("default");
        }

    }

}

输出:

c
d

结论:

若当前匹配成功的case不存在break,则从当前case开始,依次执行后续case代码块,直到遇到break,跳出判断。

4 结论

因此switch case执行时,一定会先进行匹配,匹配成功返回当前case的值,再根据是否有break,判断是否继续输出,或是跳出判断。

还需注意的是case后面只能是常量,可以是运算表达式,但一定要符合正确的类型。不能是变量,即便变量在之前进行了赋值,JVM依然会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值