2015-04-05 25 views
1

當我使用下面的代碼,編譯錯誤發生。好奇,是否條件和例外

try { 
     throw new Exception("Exceptionist"); 
     System.out.println("another line"); //compilation error 
}catch (Exception e) { 
     System.out.println("Exception:" + e.getMessage()); 
} 

編譯錯誤的原因是我們不能在拋出異常後編寫代碼。 但是,當我嘗試這樣的事情

try { 
     if (true) 
      throw new Exception("Exceptionist"); 
     System.out.println("another line"); // no compilation 
} catch (Exception e) { 
     System.out.println("Exception:" + e.getMessage()); 
} 

即使在Eclipse IDE預測syso死代碼,爲什麼不是Java點出來。即使它被編譯成字節碼,syso也不會被執行。那麼爲什麼它不被視爲編譯錯誤。 (我知道它不是一個編譯錯誤:|。可能是,表示它的一些其他方式)它是給程序員的選擇嗎?

回答

3

的解釋是在Java Language Specification

這是一個編譯時錯誤,如果不能執行的語句,因爲它是不可達。

[...]

if (false) { x=3; } 

不會導致編譯時錯誤。優化編譯器可能會意識到,語句x = 3;將永遠不會執行,並且可能會從生成的類文件中選擇省略該語句的代碼,但是語句x = 3;在這裏指定的技術意義上不被視爲「無法達到」。

這種區別對待的理由是讓程序員定義「標誌變量」,如:

static final boolean DEBUG = false; 

,然後編寫代碼,如:

if (DEBUG) { x=3; } 

的想法是,它應該可以將DEBUG的值從false更改爲true或從true更改爲false,然後正確編譯代碼,而不對程序文本進行其他更改。

所以,即使編譯器的確可以從字節碼中刪除if (true)因爲真正的是一個常量表達式,它仍然認爲if後的代碼可以到達,因爲它假定這if塊是存在有條件地執行一些用於調試原因的代碼。您必須能夠將常量表達式從false更改爲true,反之亦然,並且不會修改代碼中的其他任何內容以使其進行編譯。