switch 中缺少 enum 案例¶
ID: java/missing-case-in-switch
Kind: problem
Security severity:
Severity: warning
Precision: medium
Tags:
- reliability
- readability
- external/cwe/cwe-478
Query suites:
- java-security-and-quality.qls
基于具有 enum
类型的变量的 switch
语句应具有默认案例或处理该 enum
类型的全部可能常量。通常,处理除一两个 enum
常量外的所有常量是编码错误。
建议¶
如果只有少数几个缺失的情况,将它们添加到 switch
语句的末尾。如果有很多情况不需要单独处理,添加一个默认情况来处理它们。
如果有一些 enum
常量在代码的这一特定部分中永远不会出现,那么通过为这些常量添加情况并显式抛出异常(而不是仅仅不为这些常量添加情况)来防御性地编程。
示例¶
在以下示例中,缺少“YES”的情况。因此,如果 answer
为“YES”,则在运行时会抛出异常。要解决此问题,应添加“YES”的情况。
enum Answer { YES, NO, MAYBE }
class Optimist
{
Answer interpret(Answer answer) {
switch (answer) {
case MAYBE:
return Answer.YES;
case NO:
return Answer.MAYBE;
// Missing case for 'YES'
}
throw new RuntimeException("uncaught case: " + answer);
}
}
参考¶
帮助 - Eclipse 平台:Java 编译器错误/警告首选项。
Java 语言规范:8.9 枚举类型,14.11 switch 语句。
常见弱点枚举:CWE-478。