JDK编译器错误

时间:2011-06-01 17:05:39

标签: java exception compiler-construction

在有人对EOL的JDK尖叫之前,我想指出我的问题是关于如何编译以下内容。这里有一个真正的问题,它不是关于JDK 1.5的EOL'ed ......

以下在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 允许编译。

使用JDK 1.6允许编译。

所以我想知道:在Java 1.5下的上述代码中是否存在某些不合法的内容并且在Java 1.6下是允许的?

对于那些在Java 1.5下的人来说,它会崩溃吗?

崩溃说的是这样的:

  

发生了异常   编译器(1.5.0_22)。请提交一个错误   在Java Developer Connection上   (http://java.sun.com/webapps/bugreport)   在检查了Bug Parade之后   重复。包括你的程序和   您的以下诊断   报告。谢谢。

我认为它填写了一个错误的EOL'JDK报告是徒劳的,但我仍然想知道上面是否是有效的Java 1.5代码。

3 个答案:

答案 0 :(得分:3)

我认为这是合法的。证据是JDK 1.6.0_21使用选项-source 1.5 -target 1.5对其进行编译。你不能使用JDK 1.6和这些选项进行编译并运行JRE 1.5吗?

它也为我崩溃(JDK 1.5.0_12)。即使是:

,它也会让我崩溃
public Object boozinga() {
    boolean b = true;
    Object res = b ? new int[1] : new String[1];
    return res;
}

编译器的难点在于b ? new int[1] : new String[1]的类型是java.lang.Object & java.io.Serializable & java.lang.Cloneable

答案 1 :(得分:0)

这看起来像AutoBoxing-hell。

<击>

考虑使用Boolean而不是boolean和Integer [1]而不是int [1]。

编辑:在澄清这个不是如何纠正代码但是如何处理编译器错误的澄清评论之后,我建议尝试使用Eclipse编译器。

我们希望能够在简单的JRE上构建(因为Eclipse也可以在普通的JRE上运行),因此我尝试使用ecj35.jar作为编译器。我们非常满意。

答案 2 :(得分:0)

这里的问题是编译器无法确定表达式b ? new int[1] : new String[1]的类型。之前我有类似的东西(我认为1.1.8或1.2,但是有一个真正的错误信息,而不是编译器崩溃),然后只是使用强制转换来帮助编译器。

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

我没看到语言规范对此有何看法 - 但编译器永远不应该因异常而崩溃,它应该给出真正的错误消息。