Java 为什么不完整的开关表达式能够成功编译

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。我看到如此详细的错误消息的原因是什么导致此问

正在尝试,其中已集成为预览功能。表达式的示例代码(在JEP中也是如此):

我试图按照前面一个问题中所述的相同过程,即如何使用命令行执行上述代码块:

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