当前位置: 首页 > 面试题库 >

为什么打开枚举需要默认值?

雍宇定
2023-03-14
问题内容

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

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为定义了标签AB那么如果您传入其他任何内容,该函数将不会返回值。Java要求所有声明它们返回值的函数实际上在所有可能的控制路径上都返回一个值,并且在您的情况下,编译器不确信所有可能的输入都返回了值。

我相信(我不确定)这是因为即使您涵盖所有enum情况,在某些情况下代码仍然可能失败。特别是,假设您编译包含此switch语句的Java代码(效果很好),然后稍后更改,enum以便现在有了第三个常量-
假设C-但您不使用其中的switch语句重新编译代码。现在,如果您尝试编写使用先前编译的类并传递C到该语句中的Java代码,则该代码将没有返回值,这违反了Java协定,即所有函数始终返回值。

从技术上讲,我认为真正的原因是JVM字节码验证程序始终拒绝函数,其中某些控制路径不在函数末尾(请参阅JVM规范的
§4.9.2 ),如果代码进行编译,无论如何它只会在运行时被JVM拒绝。因此,编译器会为您提供错误以报告存在问题。



 类似资料:
  • 假设我有一个包含 2 个可能值的枚举:和: 现在假设我有一个这个枚举的switch语句,其中有两个可能值的代码: 由于我有枚举的两个可能值的代码块,因此在上面的代码中的用法是什么? 如果代码以某种方式到达块,我是否应该抛出异常?

  • 问题内容: 我们有一个带有枚举字段-的实体,我们想使用JPA注释-为它设置默认值。 但是,当我们将实体保存到数据库时,此字段的值为和。对于布尔字段- 正确的默认值()已保存。 如果改为使用:,则会在保存时得到以下异常: 我们做错了什么?为什么它仅适用于布尔值? 问题答案: 当某些SQL代码在未为emailCommunicationStatus列指定任何值的情况下插入一行时,您所做的工作很有用。在这

  • 问题内容: 我很清楚Java中枚举的高级用法。对我来说,许多区别于普通班和告诉他们需要的观点也很清楚。 谁能举一些带有高级枚举示例代码的实际示例?可以清楚地阐述一下 我们应该避免使用类,而应该使用枚举 。 请不要混淆。我不是在问如何使用枚举或枚举的用途是什么。关于此有很多问题和答案。我正在寻找一些实时/实时/实际的例子,我们应该避免任何其他数据类型或类。 问题答案: 试试这个例子: 用法:

  • 我在Swagger V2中有一个API规范的请求主体。0,如下所示。 现在,我希望在默认情况下具有值,如果它不是从客户端设置的。我试图实现这一点如下,但没有运气。 我还尝试过使用,再次无效。也对文档进行了梳理,但没有找到进一步的内容。我错过了什么? 我试图实现的是为这个属性设置一个默认值。当枚举在以下行中定义时,此操作有效。 但是,这对我不起作用,因为我希望重用枚举,否则我将不得不在多个地方重复。

  • 问题内容: 我是一名即将毕业的计算机科学专业的学生,​​在我的整个编码生涯中,我发现很少使用枚举的实例,除了典型的情况(例如代表标准纸牌的面孔)外,还使用了枚举。 您是否知道在日常编码中使用枚举的任何巧妙方法? 为什么枚举如此重要,在什么情况下应该能够确定建立枚举是最佳方法? 问题答案: 这些是主要的论点,以及短的例子。 的情况 从Java 6开始,是一个凌乱类的示例,该类可以从使用中受益匪浅(除

  • 我听到一些人建议在C++中使用枚举类,因为它们的类型安全。 但这到底意味着什么呢?