java - 为什么不完整的switch表达式编译成功
问题描述
试用JDK/12 EarlyAccess Build 20,其中JEP-325 Switch Expressions已作为预览功能集成。表达式的示例代码(在 JEP 中也是如此):
Scanner scanner = new Scanner(System.in);
Day day = Day.valueOf(scanner.next().toUpperCase());
int i = switch (day) {
case MONDAY,TUESDAY, WEDNESDAY:
break 0;
default:
System.out.println("Second half of the week");
// ERROR! Group doesn't contain a break with value
};
我试图按照上一个问题中关于如何使用 Maven 编译 JDK12 预览功能并使用命令行执行上述代码块的相同过程:
java --enable-preview -jar target/jdk12-updates-1.0.0-SNAPSHOT.jar
出乎我的意料,我收到以下错误:
Error: Unable to initialize main class com.stackoverflow.nullpointer.expression.SwitchExpressionMustComplete Caused by: java.lang.VerifyError: Bad local variable type Exception Details: Location: com/stackoverflow/nullpointer/expression/SwitchExpressionMustComplete.main([Ljava/lang/String;)V @66: iload Reason: Type top (current frame, locals[4]) is not assignable to integer Current Frame: bci: @66 flags: { } locals: { '[Ljava/lang/String;', 'java/util/Scanner', 'com/stackoverflow/nullpointer/Day' } stack: { } Bytecode: 0000000: bb00 0259 b200 03b7 0004 4c2b b600 05b8 0000010: 0006 4db2 0007 2cb6 0008 2eaa 0000 001f 0000020: 0000 0001 0000 0003 0000 0019 0000 0019 0000030: 0000 0019 0336 04a7 000b b200 0912 0ab6 0000040: 000b 1504 3eb1 Stackmap Table: append_frame(@52,Object[#2],Object[#34]) same_frame(@58) same_frame(@66)
我知道该文档指出该代码是错误的,并且将注释替换为break 1;
解决了它,但我的问题是:
Q1。为什么编译阶段同样成功?这不应该在编译时失败吗?
Q2。我看到如此详细的错误消息的原因是什么?该--enable-preview
功能可以对此负责吗?
解决方案
这是一个已知的错误。有关其状态的详细信息,请参阅JDK-8212982 。
这段代码:
public class SwitchBug { static String hold(String item) { return switch(item) { case String s -> { System.out.println(s); } default -> "temp"; }; } public static void main(String[] args) { System.out.println(hold("bug")); } }
编译并产生:
bug temp
该程序不应编译,因为第一种情况正常完成。
推荐阅读
- iis - W3 服务停止,但 w3wp.exe 仍在运行数秒
- java - 尝试从 Selenium Web 自动化的下拉列表中选择一个选项 -error-“ElementNotInteractableException:无法滚动到视图中”
- docker - 为什么 Docker 会阻止将容器附加到主机和用户定义的桥接网络?
- sql - 如何在将批次插入表时提交循环内的每次迭代
- javascript - 在 HTML/CSS 中给画布同样的最大高度和宽度
- javascript - JavaScript 构造函数中的 this = {} 表达式是什么意思?
- vue.js - v-list 中的 v-list 不适用于 vuetify
- java - 使用 Java 使用 Apache POI 删除 Word 中的域代码
- firebase - 在 Flutter 中查询 Firestore 数据库数组中存在的数据
- regex - 列名正则表达式 - Pandas