通常,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(使用前将#替换为@)