Java 为什么不完整的开关表达式能够成功编译
正在尝试,其中已集成为预览功能。表达式的示例代码(在JEP中也是如此): 我试图按照前面一个问题中所述的相同过程,即如何使用命令行执行上述代码块:Java 为什么不完整的开关表达式能够成功编译,java,javac,java-12,preview-feature,switch-expression,Java,Javac,Java 12,Preview Feature,Switch Expression,正在尝试,其中已集成为预览功能。表达式的示例代码(在JEP中也是如此): 我试图按照前面一个问题中所述的相同过程,即如何使用命令行执行上述代码块: java --enable-preview -jar target/jdk12-updates-1.0.0-SNAPSHOT.jar 出乎我的意料,我犯了以下错误: 我知道文件指出代码错误,并将注释替换为break 1解决了它,但我的问题是: 问题1为什么编译阶段同样成功?这不应该在编译时失败吗 问题2。我看到如此详细的错误消息的原因是什么导致此问
java --enable-preview -jar target/jdk12-updates-1.0.0-SNAPSHOT.jar
出乎我的意料,我犯了以下错误:
我知道文件指出代码错误,并将注释替换为break 1代码>解决了它,但我的问题是:
问题1为什么编译阶段同样成功?这不应该在编译时失败吗
问题2。我看到如此详细的错误消息的原因是什么导致此问题的--启用预览功能是否可能?
这是一个已知的错误。看见
有关其状态的详细信息
此代码:
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
此程序不应编译,因为第一个案例正常完成
嗯,不确定它们是如何链接的,但恰恰相反,这个bug报告中的代码实际上无法为我编译,错误为:或->预期。。。。不是陈述问题的另一部分如何,我看到如此详细的错误消息的原因是什么?(并不是说我担心看到它,只是好奇我是否可以使用一些JVM标志切换到此视图以查看报告的错误。)@Naman在这个答案的示例中,错误的案例在值返回案例之前,因此代码流到达后续案例并执行它,错误地返回该值。在您的问题的示例中,错误的一个后面没有案例,因此它使局部变量未初始化。但是很明显,您的实际代码包含了一个试图在之后使用该变量的尝试,并且具有一个使用未初始化变量的代码路径,这使得字节码无效。因此,代码被JVM的验证器拒绝,您看到的是HotSpot的诊断出现了一个VerifyError
。@Holger事实上,我在switch表达式之后使用了变量,很高兴知道我获取这些详细日志的原因。谢谢分享细节。
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