Java 17:如果没有返回,则不会显示警告“switch 表达式未涵盖所有可能的输入值”

问题描述 投票:0回答:1

我正在 IntelliJ IDEA 2022.2 中使用 Java 17 进行开发。

在某些情况下会显示

'switch' expression does not cover all possible input values
,但在某些情况下不会显示。我想知道为什么。

假设

entityType
是一个具有 3 个值的 enum,我要添加第四个
TYPE_D
。因此,我希望在
'switch' expression does not cover all possible input values
中使用此枚举时看到
switch
错误。

显示时:

public Map<String, String> getRecordDetails() {
    return switch (entityType) {
        case TYPE_A -> Map.of("A","A");
        case TYPE_B -> Map.of("B","B");
        case TYPE_C -> Map.of("C","C");
    };
}

未显示时:

public String getRecordDetails() {
    StringBuilder stringBuilder = new StringBuilder();
    switch (entityType) {
        case TYPE_A -> stringBuilder.append("A");
        case TYPE_B -> stringBuilder.append("B");
        case TYPE_C -> stringBuilder.append("C");
    };
    return stringBuilder.toString(); 
}

当我返回

switch
case 时,我看到它是相关的,但是为什么当我在函数代码中有 switch case 时它没有显示?

java switch-statement switch-expression
1个回答
10
投票

当您使用

switch
作为
return
的一部分时,它是一个 switch 表达式。但是,如果您只是将
switch
随机放在方法中间,它会被解析为 switch 语句。这些有不同的规则。重要的是,切换表达式需要详尽无遗。

来自 Java 语言规范

如果选择器表达式的类型不是枚举类型,则只有一个与 switch 块关联的默认标签。

如果选择器表达式的类型是枚举类型,则 (i) 与 switch 块关联的 case 常量集合包括枚举类型的每个枚举常量,并且 (ii) 至多有一个默认标签与 switch 块关联开关块。

另一方面,switch 语句没有这个限制。

直观地说,表达式必须计算出一个值,但语句不必这样做。因此,switch 表达式必须涵盖所有情况。如果不这样做,那么就会出现无法评估任何内容的情况。

在 Java 更高版本的预览规范中,“详尽开关”的概念得到了更明确的定义,因为它们现在需要支持模式匹配等功能。

如果 (i) switch 块包含默认 switch 标签,或者 (ii) 包含 switch 标签支持的所有不受保护的 case 元素的集合,则 switch 表达式或 switch 语句的 switch 块对于 T 类型的选择器表达式是详尽的开关块中的 T 是详尽的,其指定如下:[...]

然后稍后

switch 表达式必须是详尽的 (14.11.1.1),否则会发生编译时错误。

© www.soinside.com 2019 - 2024. All rights reserved.