当前位置: 首页 > 知识库问答 >
问题:

编译器插入了什么异常来处理开关表达式中的未知枚举值?

孙志
2023-03-14

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

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

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语句未预料到的另一个条目(例如,三个条目)。

JEP和这篇文章都提到编译器插入了一个default子句,该子句抛出一个异常来指示这种不协调。

我找不到任何记录抛出的异常的确切类型的东西。编译器在开关表达式中插入的默认子句抛出的异常是什么?

共有1个答案

鲁杜吟
2023-03-14

这记录在JLS 15.28.2中:

如果没有匹配的开关标签,则抛出不兼容ClassChangeError,因此整个开关表达式会突然完成。

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

 类似资料:
  • 给定一个包含枚举列的表,如下所示: 如何使用jOOQ插入到上述表中,而不为整个表生成Java代码?对于这个特定的实例,由于其他技术限制,我无法(目前)简单地生成代码。如果有帮助的话,我可以复制粘贴一段生成的代码(例如类型定义),但整个表太多了。 我尝试的是: > 根本不打字: 正如所料,这会引发不兼容的类型: :SQL[

  • 问题内容: 尝试从数据库检索记录时,我得到了枚举类的“未知名称”值。使用JSF 2.0,JPA。 我的数据库中可能的值为“ F”或“ J” 枚举: 实体: 当我尝试从数据库读取记录时出现错误 您能帮我解决这个问题吗?谢谢 堆栈跟踪: javax.servlet.ServletException:枚举类br.com.aaa.xxx.entidade.TipoPessoa的未知名称值:F javax.

  • 在以下代码中(在本地和Wandbox上测试): MSVC 15.8.5编译失败: (全部指包含的行) Clang 8(HEAD)报告: gcc 9(负责人)报告: 为什么? 首先,它们显然都认为enum-id是非常数,尽管它们显然实际上是众所周知的编译时常数值。 其次,MSVC抱怨读取超出生存期,但的生存期及其值应在中的整个使用过程中延长。 第三,gcc有一个奇怪的const-vs非const抱怨

  • 问题内容: 在eclipse中,我使用抛出异常的方法时,通常会抱怨它是否未被try / catch包围,或者是否未再次抛出异常。但是对于某些例外情况(例如Integer.parseInt(string)),Eclipse不会抱怨。 我该如何设置Eclipse来抱怨所有未处理的异常? 谢谢! 问题答案: 简单的答案是,你做不到。 更长的答案是: 检查与未检查异常是Java语言的基本组成部分。 给出有

  • 问题内容: 这是来自有效的Java 使用int枚举模式的程序很脆弱。因为int枚举是编译时常量,所以它们被编译到使用它们的客户端中。 有人可以解释为什么int枚举模式被称为编译类型常量,以及将其 编译到客户端 意味着什么吗? 这是一个这样的常量的例子: 问题答案: 假设您有两个文件: 都编译它们,运行,它将打印出1。 现在将Foo.java更改为2,然后重新编译 Foo.java 。重新运行,它将

  • 本文向大家介绍了解C++编程中指定的异常和未经处理的异常,包括了了解C++编程中指定的异常和未经处理的异常的使用技巧和注意事项,需要的朋友参考一下 noexcept C++11:指定函数是否可能会引发异常。 语法 参数 表达式 计算结果是 True 或 False 的常量表达式。无条件版本相当于 noexcept(true)。 备注 noexcept(及其同义词 noecept(true))指定函