CodeQL 文档

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

单击以在 CodeQL 存储库中查看查询

基于具有 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);
	}
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私