枚举的详尽 switch 语句的静态分析 [重复]

Posted

技术标签:

【中文标题】枚举的详尽 switch 语句的静态分析 [重复]【英文标题】:Static analysis of exhaustive switch statements of enums [duplicate] 【发布时间】:2018-05-30 14:55:56 【问题描述】:

考虑以下代码:

enum MyEnum 
  A, B, C;


int foo(MyEnum e) 
  switch (e) 
    case A:
      return 1;
    case B:
      return 2;
    case C:
      return 3;
  

^ error: missing return statement

编译器不喜欢这样。将此示例与:

int bar() 
  if (...) 
    return 1;
   else 
    return 2;
  

开关的问题可以通过default 案例解决,但您可能会争辩说这里不需要。所有枚举值都包含在 switch 的情况下。 switch 语句的静态分析是否知道,在穷举 switch 中返回时,switch 语句之后的代码块是不可达的?

我尝试查看language spec,但我没有看到清楚地解决这一点。

【问题讨论】:

然后一位开发人员决定将D 添加到MyEnum,这会导致20 个不相关的类不再编译,因为它们都有没有默认大小写的开关。 @JaroslawPawlak 因为测试,这不是问题。 @vincrichaud 是的,看起来这是个骗子。谢谢指点。 @JaroslawPawlak 哦,我更喜欢那 20 个不相关的类被证明是错误的, 【参考方案1】:

嗯,Java 并不像 C/C++ 或 .NET 等其他语言那样本机实现枚举。它们只是(最终)类的实例。因此,实际上您的运算符 == 比较的是 reference 相等性,而不是您可能建议的整数值。

这就是switch语句不完整的原因。引用可能只是null

此外,您可能已经使用公共构造函数定义了自己的枚举类,该构造函数可以创建任意数量的实例。


顺便说一句:实现foo 方法的最简单的方法是

int foo(MyEnum e)
 return e.ordinal() + 1;

但请注意,.ordinal() 不会返回与您的枚举常量相关的任何值。它只是按定义顺序排列的索引。

【讨论】:

规范明确指出,switch 将在输入时抛出 NPE,尽管这不是一个检查异常:“当 switch 语句执行时,首先计算表达式。如果表达式计算为 null,抛出 NullPointerException 并且整个 switch 语句因此突然完成。" 对不起,我不清楚,但我并没有试图实现这个确切的例子。这只是一个简单的例子来说明我在说什么。假设你总是返回其他方法调用的结果。

以上是关于枚举的详尽 switch 语句的静态分析 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

枚举异常

switch语句

从用户输入中提取整数的枚举 Switch 语句

Java--枚举类型(枚举类型实现接口 & 枚举类型之间的比较 & 枚举类型用于switch语句)

Java学习:switch语句使用的注意事项

Java 使用带有 switch 语句的枚举