为什么在使用Switch表达式时无法在一行中表示返回值? 为什么在使用Switch表达式时,不能在一行中表示返回值?

4
while (true) {
    console.mainMenu();
    String inputCommand = console.input();
    switch(inputCommand) {
        case "exit" -> return;
        case "create" -> {
            Voucher voucher = createVoucher();
            voucherRepository.save(voucher);
        }
        case "list" -> voucherRepository.findByIdAll();
        default -> console.output(Error.INVALID_COMMAND);
    }
}

上面代码中的 case "exit" -> return; 发生了错误。
在 switch 表达式中,如果代码写成单行形式,你可以省略花括号,但是编译器会要求添加花括号。
这是我遇到的编译错误:
error: unexpected statement in case, expected is an expression, 
a block or a throw statement case "exit" -> return;

为什么会出现这个问题?

如果我加上括号,它就可以正常工作。

但是当括号被删除时,我想知道为什么会出现错误?


2
  1. 这不是一个 switch expression,只是一个 switch statement- 根据JLS 14.11(和编译器)的规定;2)错误信息应该提供相关信息,例如“作为语句的无效表达式”(试着在 return; 周围使用 { })。
- user16320675
1
return; 不是一个表达式,也不是一个代码块,也不是一个抛出语句——正如之前建议的那样,在它周围使用 {},将其转换为代码块。 - user16320675
我在这里复现了问题:https://jdoodle.com/ia/ppq。如果`return;`语句被`{`和`}`包围,它将编译通过。问题是为什么? - dan
1
@user16320675 的目标是重现原帖中的错误信息,显然并不是说 Java 出了问题。 - dan
1个回答

4
您不能在switch表达式中使用语句作为规则(箭头后面的部分)。它必须是表达式或块(可以包含一个或多个语句),以下是规范中有效的规则

SwitchRule:

  • SwitchLabel -> Expression ;

  • SwitchLabel -> Block

  • SwitchLabel -> ThrowStatement

下面是一个有效规则的示例:
int a = 9;
switch(a) {
    case 1 -> System.out.println(a);                 // Expression
    case 2 -> {return;}                              // Block
    default -> throw new IllegalArgumentException(); // ThrowStatement
}

这些是Oracle's tutorial中关于表达式、语句和代码块的定义。 表达式

表达式是由变量运算符方法调用组成的结构,按照语言的语法构造,评估为单个值。

语句

语句大致相当于自然语言中的句子。语句形成一个完整的执行单元。以下类型的表达式可以通过在表达式末尾加上分号(;)将其转换为语句。

代码块

代码块是在平衡大括号之间的零个或多个语句

return;不是变量或方法调用,它是一条语句。因此,必须将其包含在花括号中以形成代码块。

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