Java switch-yield语法中逻辑非符号引发的编译异常问题
Java Switch-Yield语句中逻辑非(!)引发的编译错误
问题场景
使用Java的switch-yield语法时,若yield后直接紧跟逻辑非符号!,会触发编译错误;但把!放在逻辑或||右侧时,代码可正常编译通过。
编译失败示例
final var error = switch(args[0]) { case "A" -> { yield !true || true; } default -> false; };
编译时抛出错误:
error: not a statement yield !true || true; ^
编译成功示例
final var success = switch(args[0]) { case "A" -> { yield true || !true; } default -> false; };
解决办法
给yield后的表达式加上括号,明确表达式的整体结构,消除编译器的解析歧义:
final var fixed = switch(args[0]) { case "A" -> { yield (!true || true); } default -> false; };
原因说明
这是Java语法解析的歧义问题。编译器遇到yield !时,会错误地将其识别为yield语句搭配否定操作的语句结构,而非把!true || true当作一个完整的表达式处理。而当!位于||右侧时,yield后先出现的是true这个明确的表达式,编译器能正确解析整个逻辑运算式,因此不会报错。
内容的提问来源于stack exchange,提问作者boozilla
相关产品推荐
相关产品推荐

