【问题标题】:What exception is inserted by the compiler to handle unknown enum values in switch expressions?编译器插入了什么异常来处理 switch 表达式中的未知枚举值?
【发布时间】:2021-06-15 01:29:05
【问题描述】:

JEP 361 引入了 switch 表达式,减少了 switch 常用用法的冗长。

作为此功能的一个特定细节,无需为枚举上的 switch 表达式编写 default 类。以下代码编译:

public enum MyEnum {
    ONE,
    TWO;
}

public class OtherClass {
    public static String computeAttribute(MyEnum myEnum) {
        return switch (myEnum) {
            case ONE -> "one";
            case TWO -> "two";
        };
    }
}

switch 表达式目前是详尽无遗的,但如果单独重新编译枚举,则新版本的枚举可能包含 switch 语句未预料到的另一个条目(例如THREE)。

JEP 和this post 都提到编译器会插入一个默认子句,该子句会引发异常以指示这种不和谐。

我找不到任何记录所引发异常的确切类型的内容。编译器在对枚举值的 switch 表达式中插入的 default 子句抛出的异常是什么?

【问题讨论】:

  • 但这不是小事一桩吗?

标签: java switch-statement


【解决方案1】:

这记录在JLS 15.28.2:

如果没有匹配的开关标签,则抛出IncompatibleClassChangeError,并且由于这个原因整个开关表达式突然完成。

显然,添加新的枚举案例是“不兼容的类更改”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多