2016-05-09 60 views
1

我正在搞一點Java和void-methodreturn語句。Java編譯器 - 幾種方法,相同的行爲,不同的輸出

在每種方法中,我的Eclipse IDE(Eclipse Mars 4.5.2,Java 7)中的編譯器具有不同的輸出。我已經寫過警告/錯誤作爲對相關行的註釋:

public static void foo() { 
     System.out.println("foo() - 1"); 
     boolean b = true; 
     if (b) 
      return; 
     System.out.println("foo() - 2"); 
    } 

    public static void foo2() { 
     System.out.println("foo2() - 1"); 
     // compiler warning: "The value of the local variable b is not used" 
     boolean b; 
     if (b = true) 
      return; 
     System.out.println("foo2() - 2"); 
    } 

    public static void foo3() { 
     System.out.println("foo3() - 1"); 
     if (true) { 
      return; 
     } 
     // compiler warning: "Dead code" 
     System.out.println("foo3() - 2"); 
    } 

    public static void foo4() { 
     System.out.println("foo4() - 1"); 
     return; 
     // compiler error: "Unreachable code" 
     System.out.println("foo4() - 2"); 
    } 

每種方法都有相同的行爲。 if-statement爲真,調用return-statement。最後的System.out.println(..)不再被調用。但爲什麼編譯器輸出不同的東西呢?

感謝您的幫助!

親切的問候

PS:我的Eclipse看起來像這樣: enter image description here

PPS:如果我通過javac Test.java編譯這個文件我沒有得到任何警告,但我不得不使用手動禁用它們-nowarnjavac documentation),但我沒有這樣做:

enter image description here

+1

因爲代碼是不同的。 – biziclop

+1

編譯器足夠聰明,可以診斷'if(true)'而不是其他情況 –

+0

發佈字節碼? – djechlin

回答

2

一個編譯器的主要任務是檢查有效的語法

末方法後retrun聲明沒有其他的說法可能是因爲編譯錯誤。

並且previuos方法被編譯,因爲即使存在明顯的死代碼警告,語法也是正確的。

所以試試吧。

1

僅僅是因爲在前兩個版本中沒有garauntee條件在運行時不會改變(就編譯器而言),而在最後2版本中,條件在運行時不會改變。

奇怪的是,把一個final沒有幫助編譯器實現死代碼,儘管確保b永遠不會改變。

看來,編譯犯規做任何努力去評估你的代碼在任何水平上尋找死代碼...

1

代碼分析是敏感的「停止問題」一般。要獲取有關代碼的一些信息,您通常必須運行代碼(如果代碼包含無限循環,分析器將在分析期間掛起)。由於這個問題,在foo和foo2中,代碼分析器不能預測未來的代碼行爲。

foo4:這只是Java語法錯誤。返回語句後不允許編寫代碼。

foo3:代碼在語法上是正確的,但是正如RC提到的那樣,與IDE集成的代碼分析器能夠執行簡單的檢測,從不會觸發分支。

相關問題