2016-06-07 73 views
4
public class ExceptionTest { 
    public static void main(String[] args) { 
     ExceptionTest et = new ExceptionTest(); 
     try { 
      et.testMethod(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    public int testMethod() { 
     try {   
      throw new Exception(); 
     }finally { 
      return 4; 
     } 
    } 

上面的代碼工作正常,但是當我改變的testMethod()返回類型爲void和轉產return 4;System.out.println("some print msg");導致編譯問題。異常處理沒有趕上嘗試,但最終

任何人都可以給解決方案,爲什麼它給編譯錯誤?

+0

這個問題似乎寧可爲什麼它是*不*在第一種情況下給了一個錯誤,當你清楚不捕捉異常或聲明它拋出。 – Gendarme

+0

在Java8中工作得很好... – Paul

+0

@Paul我在Java 8中遇到了錯誤。 – Gendarme

回答

4

問題是finally代碼塊中的return語句會導致可能拋出try塊中的任何異常。

當你從finally中刪除返回時,代碼正在做的是拋出一個checked異常,它需要你拋出異常或者你捕獲它,這就是編譯器出錯的原因。

回報的行爲最終是用Java語言規範描述,這裏是很好的解釋http://thegreyblog.blogspot.it/2011/02/do-not-return-in-finally-block-return.html

+1

您能否詳細說明*爲什麼會拋棄異常?我沒有找到任何即時解釋爲什麼會發生在您的鏈接。 – Gendarme

+0

在這個問題中說,在刪除return語句時,會出現問題。 – cslotty

+0

@cslotty當你返回時,這個異常顯然被丟棄*並且不需要被捕獲。這就是爲什麼你沒有得到你期望得到的錯誤。 – Gendarme

0

這代碼在Java 8中工作:

public class ExceptionTest { 
    public ExceptionTest() { 

    } 

    public static void main(String[] args) { 
     ExceptionTest et = new ExceptionTest(); 
     try { 
      et.testMethod(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void testMethod() throws Exception { 
     try { 
      throw new Exception(); 
     } finally { 
      //return 4; 
      System.out.println("hello finally"); 
     } 
    } 
} 

我唯一的編譯問題是方法聲明中缺少「throws Exception」。

這是輸出:

hello finally 
java.lang.Exception 
    at ExceptionTest.testMethod(ExceptionTest.java:17) 
    at ExceptionTest.main(ExceptionTest.java:9) 
+0

你錯過了這一點。你不會得到一個返回一個'int'的方法的編譯錯誤,但是當它是一個'void'方法時,你的問題是*爲什麼*是這種情況。這不是對這個問題的回答。 – Gendarme

+0

那麼.....如果你運行原始代碼,你可以看到異常顯然被忽略 - 它進入finally並返回int。那麼,爲什麼問這樣一個問題,如果行爲是明顯的,可以測試和證明? - 另外,問題是「任何人都可以提供解決方案,解釋爲什麼它會導致編譯錯誤?」這就是我所做的 - 編譯錯誤消除了添加「拋出異常」。 – cslotty

+0

它根本不明顯*爲什麼*例外被忽略,這是個問題。 – Gendarme