2010-09-21 97 views
1
public class Test2 { 
    public static void main(String args[]) { 

     System.out.println(method()); 
    } 

    public static int method() { 
     try { 
      throw new Exception(); 
      return 1; 
     } catch (Exception e) { 
      return 2; 
     } finally { 
      return 3; 
     } 
    } 
} 

try塊拋出有return語句,並拋出異常也... 其輸出爲編譯器錯誤....return語句,並在Java

我們知道,finally塊覆蓋try/catch塊中的返回值或異常聲明... 但這個問題已經在try塊中... 爲什麼輸出錯誤?

+2

你介意與我們分享實際的編譯器錯誤嗎?雖然這是一個相當平凡的案例,但通常情況下,通過發佈不完整/不明確的問題,可以減少獲得良好答案的機會。 – 2010-09-21 08:30:39

回答

14

因爲您的return語句無法訪問 - 執行流程永遠無法到達該行。

如果throw聲明在if條款中,那麼return將可能可達,並且錯誤將消失。但在這種情況下,在那裏有return沒有意義。

另一個重要的注意事項 - 避免從finally子句返回。例如,Eclipse編譯器在finally子句中顯示有關return語句的警告。

+0

當然。加1. – 2010-09-21 08:34:41

+0

很好。 +1爲您的答案 – 2010-09-21 09:08:57

+0

@Bozho:+ 1.請編輯您的投擲擲出 – 2013-06-09 05:14:49

2

無論如何,throw new Exception()都會被調用,所以在try塊內的任何東西都是不可達代碼。因此錯誤。

2
public class Test2 { 
    public static void main(String args[]) { 

     System.out.println(method()); 
    } 

    public static int method() { 
     try { 
      throw new Exception(); 
      return 1; //<<< This is unreachable 
     } catch (Exception e) { 
      return 2; 
     } finally { 
      return 3; 
     } 
    } 
} 

應該最終迴歸3.

6

編譯器例外從何而來,就像我的Eclipse夥計說

Unreachable code Test2.java line 11 Java Problem 

主代碼塊的return語句將永遠不會被達到,作爲異常被拋出之前。

阿洛斯注意到你的finally塊,至少,一個設計缺陷,如Eclipse再次表示return語句

finally block does not complete normally Test2.javajava line 14 Java Problem 

事實上,作爲一個finally塊這裏只是提供一些乾淨的關閉,它預計不會返回會覆蓋該方法通常返回的結果的內容。

+1

+1。我知道你想說「設計缺陷」而不是「設計法」:) – helios 2010-09-21 08:55:47

+0

@helios我修正了錯字。感謝您的更正! – Riduidel 2010-09-21 09:24:31

0

由於try塊中的'return'關鍵字無法訪問,這就是爲什麼你得到編譯時錯誤。忽略try塊中的'return'關鍵字,然後運行你的程序,你的程序將成功編譯。