gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:49:09 25 4
gpt4 key购买 nike

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

我相信(我不确定)这样做的原因是,即使您涵盖了所有 enum 案例,在某些情况下代码仍然可能会失败。特别是,假设您编译了包含这个 switch 语句的 Java 代码(它工作得很好),然后稍后更改 enum 以便现在有第三个常量 - 比如说 C - 但您不会使用其中的 switch 语句重新编译代码。现在,如果您尝试编写使用先前编译的类的 Java 代码并将 C 传递到此语句中,那么代码将没有要返回的值,这违反了所有函数始终遵循的 Java 契约返回值。

从技术上讲,我认为真正的原因是 JVM 字节码 validator 总是拒绝有一些控制路径脱离函数末尾的函数(参见 §4.9.2 of the JVM spec),所以如果代码要编译它只会在运行时被JVM拒绝。因此,编译器会给出错误以报告存在问题。

关于java - 为什么枚举上的开关需要默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5013194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com