编译器插入什么异常来处理 switch 表达式中的未知枚举值?
What exception is inserted by the compiler to handle unknown enum values in switch expressions?
开关表达式由 JEP 361 引入,减少了开关常见用法的冗长。
作为此功能的一个特定细节,无需为枚举上的开关表达式编写 default
class。以下代码编译:
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 表达式中插入的默认子句抛出的异常是什么?
这在 JLS 15.28.2 中有记录:
If no switch label matches, then an IncompatibleClassChangeError
is thrown and the entire switch expression completes abruptly for that reason.
显然,添加新的枚举案例是“不兼容的 class 更改”。
开关表达式由 JEP 361 引入,减少了开关常见用法的冗长。
作为此功能的一个特定细节,无需为枚举上的开关表达式编写 default
class。以下代码编译:
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 表达式中插入的默认子句抛出的异常是什么?
这在 JLS 15.28.2 中有记录:
If no switch label matches, then an
IncompatibleClassChangeError
is thrown and the entire switch expression completes abruptly for that reason.
显然,添加新的枚举案例是“不兼容的 class 更改”。