2016-07-15 28 views
0
public class UnrechableCode { 
     public static void main (String args[]) 
     { 
      UnrechableCode uc=new UnrechableCode(); 
      try 
      { 
       System.out.println(1/0); 
      } 
      catch(Exception e) 
      { 
       System.out.print("Inside Catch"); 
       return ; 
      } 
      finally 
      { 
       System.out.println("Inside Finally"); 
       //return; 
      } 
      System.out.println("TEST"); 
     } 
} 

在上面的代碼中當從捕捉那麼語句刪除return語句finally塊不被執行之後,卻由分析器可達。 在同一場景中,如果我在最後寫入返回塊時,相同的語句無法通過解析器訪問,所以如果在前面的case語句中解析器可以訪問,爲什麼語句沒有執行。Unrechable聲明如果return語句中finally塊

+1

因爲'catch'中有'return',並且您的代碼被零除,導致異常。 –

回答

2

Java編譯器僅具有有限的能力來預測是否能夠達到程序中的特定代碼行 。 這個事實並不是Java設計者的錯;事實證明事實 不可能完全預測通用語言的所有可能程序 的行爲。 Java的設計人員唯一的選擇就是編譯器的這種能力應該是多麼有限 。

Why does Java have an "unreachable statement" compiler error? 爲編譯器爲什麼有這個能力可言,討論 爲什麼它認爲「不可達代碼」錯誤, 爲什麼有些事情會(相對容易)被檢測爲 「無法訪問的代碼「不被編譯器認爲是」不可達代碼「錯誤 。

你的具體情況,但事實上,1/0總會拋出 例外,再加上事實,那就是在catch塊捕獲該異常的return,將阻止程序 的任何執行從不斷書寫「測試「到輸出。 但是,當Java編譯器查找不可達代碼時,它不會試圖解決 如1/0所拋出的異常。 因此好像有在被執行 的try塊的可能的控制路徑,做過拋出異常(所以沒有執行任何代碼 在catch塊)它的作用,然後執行finally 塊,然後將代碼在finally塊之後。

的事情,編譯器 考慮的是,finally塊將 始終遵循它,代碼之前執行一和,如果有 在finallyreturn,在return後的代碼 根本不會執行。 因此finally塊中的return將在代碼無法訪問後使代碼爲 。

TL; DR:在一種情況下,由於Java編譯器旨在識別的 的原因,「TEST」語句無法訪問;在另一種情況下,由於Java編譯器設計爲識別的而不是,「測試」語句無法訪問。

+0

編譯器在兩種情況下顯示其限制的方式不同。當我在catch塊中寫入return語句時,TEST語句是可訪問的(無編譯時錯誤。)但它沒有執行,並且當我最後返回時,TEST語句甚至不可訪問(編譯時錯誤),那麼爲什麼編譯器針對相同的return語句顯示兩種不同的方案,以及它如何預測給定情況下的相應場景。 –

+0

你是什麼意思的「相同的回報聲明」?代碼中有兩個不同的地方放置了返回語句。把一個'return'放在一個地方不同於把'return'放在另一個地方,你應該期望他們可能會有不同的結果。我已經逐步追蹤了不可達代碼分析如何可能用於兩個可能的'return'語句中的每一個。 –

+0

這裏的「相同返回語句」是指將某些東西返回給方法的行爲應該總是以同樣的方式進行,但在我們的情況下,它不是,因爲catch塊返回,TEST語句是可到達的(但不能執行,爲什麼?)和由於最終阻塞返回,TEST語句無法訪問,爲什麼?在這裏返回語句顯示不同的行爲,這是什麼確切(相同的返回語句)我問about.please更多地區分爲什麼TEST值不打印,但我可以訪問時,在catch中返回,但最後爲相同的返回TEST語句無法訪問。 –