[英]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.