为什么使用切换表达式时不能用一行表示返回?


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;

为什么会出现问题?

如果我加一个括号,效果很好。

但我想知道为什么删除括号后会出现错误?

开关表达式中,不能将语句用作规则(箭头->之后的部分(。它必须是一个表达式或块(可以包含一个语句或多个语句(

根据规范,这些是有效的规则

切换规则:

  • 切换标签->表达式

  • 切换标签->阻止

  • 切换标签->ThrowStatement

有效规则示例:

int a = 9;
switch(a) {
case 1 -> System.out.println(a);                 // Expression
case 2 -> {return;}                              // Block
default -> throw new IllegalArgumentException(); // ThrowStatement
}

这些是Oracle教程中对表达式、语句和块的定义。

表达式

表达式是由变量运算符方法调用组成的构造,这些变量根据语言语法构造,计算结果为单个值。

声明

语句大致相当于自然语言中的句子。语句形成完整的执行单元。通过用分号(;(终止表达式,可以将以下类型的表达式组成一个语句。

阻止

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

return;不是变量或方法调用,它是语句。因此,它必须包含在花底中才能形成一个代码块。

最新更新