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); } } Se produce un error en el case "exit" -> return; en el código anterior.
En una expresión de cambio, si el código se expresa como una sola línea, puede omitir los corchetes, pero continúa solicitando la adición de corchetes.
Este es el error de compilación que estoy recibiendo:
error: unexpected statement in case, expected is an expression, a block or a throw statement case "exit" -> return;¿Por qué está ocurriendo el problema?
Si agrego un soporte, funciona bien.
Pero me pregunto por qué ocurre el error cuando se eliminan los corchetes.
No puede usar una declaración como regla (la parte después de la flecha -> ) en una expresión de cambio . Debe ser una expresión o un bloque (que puede contener una declaración o varias declaraciones)
Estas son reglas válidas según la especificación:
Cambiar regla:
SwitchLabel -> Expresión ;
Cambiar etiqueta -> Bloquear
Cambiar etiqueta -> Tirar declaración
Ejemplo de reglas válidas:
int a = 9; switch(a) { case 1 -> System.out.println(a); // Expression case 2 -> {return;} // Block default -> throw new IllegalArgumentException(); // ThrowStatement }Estas son las definiciones de expresión, declaración y bloque del tutorial de Oracle .
Expresión
Una expresión es una construcción formada por variables , operadores e invocaciones de métodos, que se construyen de acuerdo con la sintaxis del lenguaje, que se evalúa como un solo valor.
Declaración
Las declaraciones son aproximadamente equivalentes a oraciones en lenguajes naturales. Una declaración forma una unidad completa de ejecución . Los siguientes tipos de expresiones se pueden convertir en una declaración terminando la expresión con un punto y coma (;).
Cuadra
Un bloque es un grupo de cero o más declaraciones entre llaves balanceadas
return; no es una invocación de variable o método, es una declaración . Por lo tanto, debe encerrarse entre bases rizadas para formar un bloque de código.