2011-03-23 181 views
8

我遇到了一個奇怪的錯誤,我認爲這是一個錯誤。 這裏是一個最小的情況下,請不要對代碼的有效性發表意見:)javac奇怪的語法 - 錯誤表達式的非法開始

class Foo { 

    static public <X> int bar() { return 42; } 

    public int baz() { 
     return true ? 42 : (
      Foo.<Void>bar() > 42 ? 41 : 43 
     ) 
     ; 
    } 
} 

結果:

err.java:7: illegal start of expression 
     Foo.<Void>bar() > 42 ? 41 : 43 
      ^

我已經試過SUN SDK的javac 1.6.0_13和1.6.0_21。
的錯誤消失,當我要麼

  • 化妝棒()非通用(只是出於好奇,而不是一個真正的選擇)
  • 刪除線各地三元表達括號7

因此,看起來如果e是一個表達式,那麼編寫(e)並不總是有效的?

回答

5

張貼的代碼編譯(並運行)就好了我使用Eclipse,但我可以證實, javac無法編譯此。我懷疑你在javac中發現了一個編譯器錯誤。

這可能是一個好主意report it

+0

感謝Joachim。這就是我擔心的(目前我被標準的SDK javac 1.6所困住)。將不得不在Sun/Oracle上搜索bug數據庫,以確定它是否已修復。 – Ingo 2011-03-23 12:01:21

+1

該bug已經有3年了,但顯然不會在jdk 1.6中修復。但是,它在jdk 1.7 beta 14中得到了修復(開發者預覽版是b189,所以它在那裏修復)。 – Ingo 2011-03-30 16:37:47

+0

@Ingo:小心添加一個鏈接到你發現的錯誤? – 2011-04-08 14:18:05

-3

是返回值,你沒有通過調用一個靜態方法來指定這個:

class Foo { 

    static public <X> int bar() { return 42; } 

    public int baz() { 
     return true ? 42 : (
      Foo.bar() > 42 ? 41 : 43  
     ) 
     ; 
    } 
} 
+0

聲明''不會**指定返回值,它指定類型參數在這裏! – 2011-03-23 11:56:28

+0

正如我試圖解釋的,這段代碼純粹是爲了演示。相信我,在真正的程序中,類型的論點是不可或缺的。 – Ingo 2011-03-23 12:03:23

1

我設法在代碼中對它進行一些修改來編譯它。所以我猜這是與條件運算符規範(這有點複雜)或bug有關。但是這個問題只發生在條件運算符中。

class Foo { 

    static public <X> int bar() { return 42; } 

    public int baz() { 
     return true ? 42 : (
      ((int)Foo.<Void>bar()) > 42 ? 41 : 43 
     ); 
    } 
} 
+0

酷!看起來編譯器很困惑,並且認爲「(Foo)必須啓動一個強制轉換?」 – Ingo 2011-03-23 12:26:10

+0

@Ingo:你說的對,但是一般的指導是'不要對混合數據類型使用條件運算符(因爲spec有點複雜) '但在這種情況下你不使用混合類型。 – 2011-03-23 12:28:50

1

這個bug已經有3年了,但是顯然不會在jdk 1.6中修復。然而,它在JDK 1.7 beta 14中得到了修復(開發者預覽版是b185,所以它在那裏修復了,我試過了)。