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

5

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

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

假设entityType是一个具有3个值的枚举类型,并且我正在添加第4个值TYPE_D。因此,我希望在使用该枚举类型的switch语句中看到'switch' expression does not cover all possible input values错误。

当它被显示时:

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时却不显示?


3
在你的第一个例子中,Type_D 没有返回任何值,在你的第二个例子中,仍然返回默认值。 - Stultuske
使用默认值怎么样,例如 default -> Map.of(); - Youcef LAIDANI
5
第一个是switch表达式15.28.switch表达式),第二个是switch语句14.11.switch语句),更明确地说(https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.28.1-100-B):“如果选择器表达式的类型是枚举类型,则(i)与switch块关联的case常量集包括枚举类型的每个枚举常量。” - user16320675
3
(换句话说,表达式必须始终返回一个值[或抛出异常];语句可以什么也不做)(顺便说一句,一些IDE会对第二种情况显示警告[在Eclipse中可配置]) - user16320675
1个回答

7

当您在return的一部分中使用switch时,它是一个switch表达式。但是,如果您只是随意将switch放在方法的中间,它将被解析为switch语句。它们有不同的规则。重要的是,switch表达式需要是穷尽的。

来自Java语言规范

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

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

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

直觉上,表达式必须求值为一个值,但语句则不必。因此,switch表达式必须涵盖所有情况。如果没有,那么将会出现无法计算任何内容的情况。

在Java的稍后版本的预览规格中,"穷举开关"的概念更清晰地定义了,因为它们现在需要支持模式匹配等功能。

如果一个选择器表达式的switch表达式或switch语句的switch块对类型T是穷尽的,则 (i) switch块包含默认switch标签,或者(ii)switch块中的switch标签所支持的所有未保护的case元素组成的集合对于T是穷尽的,其具体规定如下:[...]

稍后,

一个 switch 表达式必须是穷尽的(14.11.1.1),否则会出现编译时错误。

谢谢!我并不完全同意“switch表达式必须是穷尽的(14.11.1.1),否则会出现编译时错误”的说法。这正是我想要的。当我向枚举类型添加新类型时,我希望编译器警告我必须更新使用该枚举的switch语句。 - andriy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接