Java JDK编译器错误

Java JDK编译器错误,java,exception,compiler-construction,Java,Exception,Compiler Construction,在任何人对EOL'ed JDK大喊大叫之前,我想指出,我的问题是而不是如何编译以下内容。这里有一个真正的问题,它不是关于JDK1.5被淘汰 在JDK 1.5下,直到1.5.0_22(我能找到的最后一个版本),以下内容在我的系统上产生编译器错误: private Object[] boozinga() { boolean b = Math.abs(42) > 0; Object[] res = new Object[1]; res[0] = b ? new int[1

在任何人对EOL'ed JDK大喊大叫之前,我想指出,我的问题是而不是如何编译以下内容。这里有一个真正的问题,它不是关于JDK1.5被淘汰

在JDK 1.5下,直到1.5.0_22(我能找到的最后一个版本),以下内容在我的系统上产生编译器错误:

private Object[] boozinga() {
    boolean b = Math.abs(42) > 0;
    Object[] res = new Object[1];
    res[0] = b ? new int[1] : new String[1];
    return res;
}
将Math.abs(42)>0更改为true可以进行编译

将三元“赋值”更改为if/else允许编译

使用JDK1.6允许编译

所以我想知道:上面的代码在Java1.5下是否有不合法的东西,而在Java1.6下是允许的

对于那些使用Java1.5的人来说,它也会崩溃吗

坠机事件是这样说的:

系统中发生异常 编译器(1.5.0_22)。请提交一个bug 在Java开发者连接上 (http://java.sun.com/webapps/bugreport) 在检查了Bug巡游之后 复制品。包括您的计划和 以下是您的诊断代码: 报告。多谢各位


我认为为过时的JDK填写错误报告是徒劳的,但我仍然想知道上面的代码是否是有效的Java 1.5代码。

我认为这是合法的。证据是JDK1.6.021使用选项
-source1.5-target1.5
编译它。难道你不能使用JDK1.6和这些选项来编译和运行JRE1.5吗

它对我来说也崩溃了(JDK1.5.0_12)。即使在以下情况下,我也会崩溃:

public Object boozinga() {
    boolean b = true;
    Object res = b ? new int[1] : new String[1];
    return res;
}

编译器的难点在于
b的类型是什么?new int[1]:新字符串[1]
java.lang.Object&java.io.Serializable&java.lang.Cloneable

这里的问题是编译器很难确定表达式的类型
b?新建int[1]:新建字符串[1]
。我以前有过类似的东西(我想是1.1.8或1.2,但有一条真正的错误消息,而不是编译器崩溃),然后简单地使用了一个cast来帮助编译器

 res[0] = b ? (Object)new int[1] : new String[1];

我没有看语言规范对此有何规定,但编译器永远不会出现异常崩溃,它应该会给出一条真正的错误消息。

至于我们为什么会遇到这种情况,我们仍然没有解决以下问题:在我们的系统上,我们可以在处理大量数据的同时可靠地重现JDK 1.6 sigsegv。好笑啊!?一个sigsegv JDK 1.6和一个编译器异常以及1.5都在一个项目中。而且,不,我们的RAM/系统没有故障;)代码在我看来是合法的。似乎是一个bug。任何安装了旧1.5的人(可能是OS X上的人)都可以尝试编译它吗?在Linux 2.6.22.14-72.fc6上使用1.5.0_12编译时会产生一个断言失败,并显示类似的消息。