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