2011-06-01 50 views
3

在任何人對EOL的JDK尖叫之前,我想指出我的問題是而不是關於如何編譯以下內容。這裏有一個真正的問題,它不是關於JDK 1.5被解僱......JDK編譯器錯誤

以下在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允許編譯。

改變三元 「分配」 到的if/else允許編譯。

使用JDK 1.6允許編譯。

所以我想知道:在Java 1.5下的上述代碼中有沒有合法的東西,並且在Java 1.6下允許?

它對於那些在Java 1.5下的人來說是否會崩潰?

崩潰,說是這樣的:

An exception has occured in the compiler (1.5.0_22). Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport) after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you.

我把它填充一個EOL'ed JDK的bug報告是徒勞無益的exercice但儘管如此,我還是想知道,如果上面是是否有效的Java 1.5代碼。

+1

至於爲什麼我們遇到這種情況,我們仍然沒有解決以下問題:http://stackoverflow.com/questions/2299250/java-vm-reproducable-sigsegv-on-both-1-6-0-17 - 和 - 1-6-0-18 - 如何報告以及在我們的系統上,我們可以可靠地再現JDK 1.6 * sigsegv *,同時處理大量的數據。有趣呃!?一個* sigsegv * JDK 1.6和一個1.5編譯器異常在一個項目中。不,我們的RAM /系統沒有錯誤; ) – SyntaxT3rr0r 2011-06-01 17:07:19

+1

代碼看起來對我來說合法。看起來像一個錯誤。 – jtahlborn 2011-06-01 17:24:32

+0

是否有人安裝了1.5(可能是OS X上的某個人)嘗試編譯它? – SyntaxT3rr0r 2011-06-01 17:31:32

回答

0

這看起來像是AutoBoxing-hell。

考慮使用布爾代替布爾值和整數[1]而不是int [1]。

編輯:在澄清評論這不是如何糾正代碼,但如何處理編譯器錯誤,我會建議嘗試使用Eclipse編譯器。

我們希望能夠使用普通的JRE進行構建(因爲Eclipse也可以在普通的JRE上運行),因此我嘗試使用ecj35.jar作爲編譯器。我們非常滿意。

+0

+1但這不是關於如何解決'問題'。這不是「真正的代碼」,這是我們偶然發現的。如果它是一個自動裝箱問題,那麼如何用if/else代替三元運算符?在閱讀jtahlborn的評論後,我更加困惑:) – SyntaxT3rr0r 2011-06-01 17:19:38

+4

代碼中沒有自動裝箱...? – jtahlborn 2011-06-01 17:20:07

+0

@jtahlborn,考慮如何在對象數組中放置布爾值。 – 2011-06-01 17:21:54

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

0

這裏的問題是編譯器無法確定表達式b ? new int[1] : new String[1]的類型。我之前有過類似的東西(1.1.8或1.2,我認爲 - 但是有一個真正的錯誤消息,而不是編譯器崩潰),然後在這裏簡單地使用一個轉換來幫助編譯器。

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

我沒有看什麼語言規範說這一點 - 但編譯器不應該用異常崩潰,它應該給一個真正的錯誤消息。