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

and*_*riy 5 java switch-statement switch-expression

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

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

假设这entityType是一个包含 3 个值的枚举,我添加了第四个值TYPE_D。所以我希望'switch' expression does not cover all possible input valuesswitch.

当显示时:

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");
    };
}
Run Code Online (Sandbox Code Playgroud)

未显示:

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(); 
}
Run Code Online (Sandbox Code Playgroud)

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

Swe*_*per 7

当您使用 aswitch作为 a 的一部分时return,它是一个switch 表达式。但如果你只是将switchrandom 放在方法中间,它会被解析为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),否则会发生编译时错误。