簡體   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