为什么枚举上的开关需要默认值?

2024-02-01

通常,switch 语句中不需要 default。但是,在以下情况下,只有当我取消注释默认语句时,代码才能成功编译。有人能解释一下为什么吗?

public enum XYZ {A,B};
public static String testSwitch(XYZ xyz)
{
    switch(xyz)
    {
    case A:
        return "A";
    case B:
    //default:
        return "B";
    }
}

您必须取消注释的原因default你的函数说它返回一个String,但如果你只有case定义的标签A and B那么如果您传入其他任何内容,该函数将不会返回值。 Java 要求所有声明返回值的函数实际上在所有可能的控制路径上返回一个值,并且在您的情况下,编译器不相信所有可能的输入都有一个返回值。

我相信(我不确定这一点)其原因是即使您涵盖了所有enum在某些情况下,代码仍然可能会失败。特别是,假设您编译包含此 switch 语句的 Java 代码(效果很好),然后稍后更改enum现在有第三个常数 - 比方说C- 但你不重新编译代码switch其中的声明。现在,如果您尝试编写使用先前编译的类并传入的 Java 代码C到这个语句中,那么代码将没有返回值,这违反了所有函数总是返回值的 Java 约定。

从技术上讲,我认为真正的原因是 JVM 字节码验证器总是拒绝某些控制路径从函数末尾脱落的函数(参见§4.9.2)JVM 规范 http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#88597),因此如果代码要编译,无论如何它都会在运行时被 JVM 拒绝。因此,编译器会给出错误来报告存在问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么枚举上的开关需要默认值? 的相关文章

  • 如何使用 Java 将 HTML 内容转换为 PDF 而不丢失格式?

    我有一些 HTML 内容 包括格式化标签 例如strong 图像等 在我的 Java 代码中 我想将此 HTML 内容转换为 PDF 文档 而不丢失 HTML 格式 有没有办法用 Java 来实现 使用 iText 或任何其他库 I use
  • 如何在java中压缩/解压tar.gz文件

    谁能告诉我在java中压缩和解压缩tar gzip文件的正确方法我一直在搜索 但我能找到的最多的是zip或gzip 单独 我写了一个包装器公共压缩 http commons apache org compress called jarchi
  • Java Sqlite Gradle

    我对 gradle 和 java 还很陌生 我有一个使用 sqlite 的项目 它通过 intellij idea 运行良好 但我无法从终端运行它 它会抛出异常 java lang ClassNotFoundException org sq
  • 如何防止在 CXF Web 服务客户端中生成 JAXBElement

    我正在尝试使用 CXF 创建一个 Web 服务客户端来使用 WCF Web 服务 当我使用 wsdl2java 时 它生成具有 JAXBElement 类型而不是 String 的对象 我读到有关使用 jaxb bindings xml 文
  • Maven 目标的默认阶段?

    据我了解 在 Maven 中 插件目标可以附加到生命周期阶段 如果没有定义 默认阶段是什么 根据我的经验 这取决于插件的目标 例如 组装 单个 http maven apache org plugins maven assembly plu
  • 如果按下 Esc 则中断循环

    我用 JAVA 语言编写了一个程序 它使用 Scanner 类接受来自控制台的输入 现在我想将此功能添加到我的代码中 以便在用户按下 Esc 按钮时存在循环 while 到目前为止 我认为键盘类可以帮助我 但它就像扫描仪一样 我尝试使用事件
  • 如何屏蔽 Protobuf 中的某些字段

    我找不到一种方法来屏蔽 protobuf 结构中的某些字段 我确实阅读了有关 FieldMaskUtil 的内容并尝试了几个示例 但它似乎做了相反的操作 即复制 FieldMask 中提到的字段 这与我想要的不同 这是示例结构和相应的测试代
  • 如何使用 BufferedReader 对象从 Java 中的一行读取多个整数值?

    我正在使用 BufferedReader 类读取 Java 程序中的输入 我想读取用户的输入 该用户可以在带空格的单行中输入多个整数数据 我想读取整数数组中的所有这些数据 输入格式 用户首先输入他 她想要输入的数字数量 然后在下一行中使用多
  • Scala(或 Java)中泛型函数的特化

    是否可以在 Scala 中专门化泛型函数 或类 例如 我想编写一个将数据写入 ByteBuffer 的通用函数 def writeData T buffer ByteBuffer data T buffer put data 但由于 put
  • MessageDigest MD5 算法未返回我期望的结果

    我脑后的某个东西告诉我 我在这里遗漏了一些明显的东西 我正在将现有的 java 项目与第三方 api 集成 该第三方 api 使用 api 密钥的 md5 哈希进行身份验证 它对我不起作用 在调试过程中我意识到我生成的哈希值与他们提供的示例
  • 更改 RowLayout SWT Java 中元素的顺序

    有没有办法更改在行布局中创建的元素的顺序 我想将其显示在元素中 首先显示 例如 如果我创建 element1 则 element2 element3 element4 我想看到的布局为 元素4 元素3 元素2 元素1 这意味着最后创建的元素
  • XSLT:我们可以使用abs值吗?

    我想知道在 XSLT 中我们是否可以使用 math abs 我在某处看到过这个 但它不起作用 我有类似的东西
  • 如何列出所有可用的 LookAndFeel 主题?

    如何列出所有可用的 LookAndFeel 主题 我想在 JComboBox 中显示以供用户选择 这真的很简单 public static UIManager LookAndFeelInfo getInstalledLookAndFeels
  • C++ 中的 Java ArrayList [重复]

    这个问题在这里已经有答案了 在Java中我可以做 List
  • 在方法内声明类 - Final 关键字 [重复]

    这个问题在这里已经有答案了 给定方法中的以下内部类 IsSomething public class InnerMethod private int x public class Something private int y public
  • 使用 Cucumber Scenario Outline 处理 Excel 电子表格

    如果可能的话 我试图找到一种更优雅的方法来处理从与 Excel 电子表格行 第 n 个 相关的 Cucumber Scenario Outline 中调用第 n 个数字 目前 我正在使用迭代编号来定义要从中提取数据的 Excel 电子表格的
  • SWT - 与操作系统无关的获取等宽字体的方法

    SWT 有没有一种方法可以简单地获得跨各种操作系统的等宽字体 例如 这适用于 Linux 但不适用于 Windows Font mono new Font parent getDisplay Mono 10 SWT NONE 或者我是否需要
  • 条件查询:按计数排序

    我正在尝试执行一个标准查询 该查询返回 stackoverflow 中回答最多的问题 例如常见问题解答 一个问题包含多个答案 我正在尝试使用标准查询返回按每个问题的答案数排序的回答最多的问题 任何人都知道我应该在 hibernate cri
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN
  • 在多线程环境中,Collections.sort 方法有时会抛出 ConcurrentModificationException。列表没有进行结构性修改

    package CollectionsTS import java util ArrayList import java util Collections import java util HashSet import java util

随机推荐

  • Javascript:无法将 href 添加到列表项

    我正在尝试将新项目添加到列表项目中 但下面的代码没有将超链接添加到我想要的列表项 有人可以告诉我出了什么问题吗 HTML div ul li Ut enim ad minim veniam li li Excepteur sint occa
  • “Angular cdk Drag drop”用于将列表中的项目拖放到容器中(无序)

    我知道 cdk 拖放可以很好地处理列表 并且有很多示例 但我想做的是 一侧是列表 另一侧是容器 容器中的物品应该位于容器中的任何位置 并且可以由 x 和 y 轴固定 因此 当从列表中拖放到容器中的某个 x y 处时 该项目应保持该位置 请帮
  • ASP MVC5 身份用户抽象

    我想使用默认的 Identity 2 提供程序构建 N 轮胎 Web 应用程序 因此 我的数据层包含带有模型定义的纯 C 类 没有任何外部依赖性 但如果不添加 AspNet Identity 引用 就不可能将某些类链接到我的应用程序用户 我
  • 如何获取 iOS 框架测试目标并在虚拟应用程序中运行它?

    所以我遇到了一个问题 我的框架需要访问KeyChain 很好 但是在模拟器中运行时似乎失败了 挖掘它似乎是一个已知的问题xctest在这里做错事了 公平地说 错误是会发生的 在 Apple 开发者论坛中 对此进行了讨论 Right 这是库测
  • 验证两个表的唯一性

    我有一个Company and Archive具有相同表结构的模型 两种型号都有一个validates name uniqueness gt true验证 在 company rb 文件中 我在设置自定义验证时遇到问题 当我将记录添加到Co
  • Ruby 的 Object#taint 和 Object#trust 方法是什么?

    我正在阅读有关 Ruby 字符串方法的内容docs http www ruby doc org core 1 9 3 String html并遇到了这些方法 taint trust untaint untrust 我不知道它们是做什么的 我
  • BottomNavigationView:如何删除连字符标签

    实现 5 项 BottomNavigationView 始终显示标签 我使用以下方法
  • 如何在 extjs 中的网格页脚中添加总行数

    我想在网格页脚中添加总行数 我有商店中可用的总行记录 在网格中 用户选择降序排列 总计行显示为第一行 谁能告诉我如何避免这种情况 我将解释我的完整问题 例如 我有像 Target Target1 Target2 这样的网格视图 是从网络服务
  • Integer.parseInt(string) 实际上是如何工作的?

    最近被问到这个问题 不知道答案 有人可以从高层次解释Java如何获取字符 字符串并将其转换为int 通常这是这样完成的 初始化结果为 0 for each character in string do this 结果 结果 10 从字符中获
  • 如何用笛卡尔绘制波纹圆?

    I m looking for a way to plot a corrugated circle https www mypandakitchen com 1656 large default emporte pieces rond on
  • 扩展界面生成器中的属性检查器

    是否可以使用继承自 UIView 的自定义类的附加属性来扩展界面构建器的属性检查器 现在不行 Interface Builder 允许您通过 Interface Builder 插件为您的对象实现自定义检查器 不过 IB Kit 目前不支持
  • 如何从 ipython 启动twisted的reactor

    我需要从 ipython 中启动一个twisted reactor 以允许继续交互 Ipython 的手册页引用了twisted 但我无法理解应该如何继续 文档引用了 IPython kernel twistedutil 所以我的印象是它应
  • 在 ASP.NET core 中添加迁移时不考虑新的更改

    我和一个朋友正在作为队友参与 ASP NET Core 项目并使用以下工具共享数据github 每次从 who 中提取更改时github 应该删除Migration folder为了添加迁移而不会出现任何错误 否则 我们会收到以下错误 数据
  • 寻找第 N 个孪生素数

    我试图解决 SPOJ 上的问题 我们需要计算第 n 个孪生素数对 相差 2 的素数 n 可以大到 10 5 我尝试使用筛子进行预先计算 我必须筛选最多 10 8 才能获得最大的 n 个孪生素数 但时间限制很严格 2s 并且超时 我注意到人们
  • Visual Studio 2012 中数据库优先实体框架模型的 MVC4 支架

    我在使用 Visual Studio 2012 时遇到问题 尝试添加带有脚手架的 MVC4 控制器 理想情况下 我希望在与我的 Web 应用程序分开的程序集中使用添加新项 ADO NET 实体数据模型 即不是代码优先 从数据库生成实体框架模
  • 如何提示 Google Smart Lock 使用特定输入字段作为网站中的用户名

    我一直在尝试搜索一些有关如何提示 Chrome 的 Google Smart Lock 使用特定输入字段作为与用户名关联的输入字段的文档 但没有任何运气 对于密码 它与使用的一样完美type password 但是 当涉及多字段表单中的用户
  • 相对于 PHP 4“opendir/readdir/closedir”,使用 PHP 5 DirectoryIterator 到底有什么好处?

    使用 PHP 5 DirectoryIterator 到底有什么好处 dir new DirectoryIterator dirname FILE foreach dir as fileinfo handle what has been f
  • 单元格格式四舍五入并显示 2 位小数

    我有一个单元格格式为数字并保留 2 位小数 实际数字是 69 30217 所以在我的单元格中 想象一下单元格 A1 它看起来像 69 30 还行吧 对于该单元格 我正在进行一些串联 因此如果我执行以下操作 E5 该数字显示为 69 3021
  • 如何让 tkinter 消息框出现在顶层前面

    我正在使用 Python 3 和 tkinter 编写一个程序 其中顶层最 初出现在根窗口的中心 如果顶层没有移开 它会覆盖任何可能出现的显示错误消息的消息框 消息框出现在根窗口前面 但在顶层后面 命令行中的简单示例显示会发生什么 gt g
  • 为什么枚举上的开关需要默认值?

    通常 switch 语句中不需要 default 但是 在以下情况下 只有当我取消注释默认语句时 代码才能成功编译 有人能解释一下为什么吗 public enum XYZ A B public static String testSwitc