繁体   English   中英

JDK编译器错误

[英]JDK compiler error

在有人对 EOL 的 JDK 大喊大叫之前,我想指出我的问题在于如何编译以下内容。 这里有一个真正的问题,它与 JDK 1.5 被 EOL 无关......

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) 发生异常。 在检查 Bug Parade 是否有重复项后,请在 Java 开发人员连接 (http://java.sun.com/webapps/bugreport) 提交错误。 在报告中包含您的程序和以下诊断。 谢谢你。

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

我认为这是合法的。 证据是 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] b? new int[1]: new String[1] is java.lang.Object & java.io.Serializable & java.lang.Cloneable .

这看起来像 AutoBoxing-hell。

考虑使用 Boolean 代替 boolean 和 Integer[1] 代替 int[1]。

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

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

这里的问题是编译器很难确定表达式b? new int[1]: new String[1] b? new int[1]: new String[1] 我以前有过这样的事情(我认为是 1.1.8 或 1.2 - 但有一个真正的错误消息,而不是编译器崩溃),然后在这里简单地使用强制转换来帮助编译器。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM