2015-06-18 54 views
2

我的Precise Rethrow的文檔閱讀,http://www.theserverside.com/tutorial/OCPJP-Use-more-precise-rethrow-in-exceptions-Objective-Java-7對於最終重新拋出

基本上,你可以列出具體的例外在拋出你的方法的條款,即使他們沒有明確catch塊,如果處理:

try塊實際上在某個時間點拋出該特定異常。

特定異常尚未在任何點由前述catch塊

在命名的異常引發方法簽名的條款必須在至少一個異常的類層次結構被處理並重新拋出處理catch塊(亞型或超)

看一看代碼(注意上拋出的main條款)

class OpenException extends Exception {} 

class CloseException extends Exception {} 

public class PRethrow 
{ 
    public static void main(String args[]) throws OpenException, CloseException, java.io.IOException 
    { 
     boolean flag = true; 
     try 
     { 
      if (flag) 
      { 
       throw new OpenException(); 
      } 
      else 
      { 
       throw new CloseException(); 
      } 
     } 
     catch (Exception e) 
     { 
      System.out.println(e.getMessage()); 
      throw e; 
     } 
    } 
} 

在第一個條件中明確提到,you can list a specific exception in throws clause if the try block actually throws that specific exception at some point in time.

在我的代碼中,try塊永遠不會拋出java.io.IOException,但仍將它包括在throws子句中不會產生錯誤。

爲什麼?

+1

你不會拋出IOException,這就是爲什麼它沒有被拋出。你需要拋出新的IOException();某處。 –

+0

@SotiriosDelimanolis:http://www.theserverside.com/tutorial/OCPJP-Use-more-precise-rethrow-in-exceptions-Objective-Java-7 –

+0

@PerryMonschau:這就是我所說的,我不是扔IOException,所以根據問題中提到的第一個條件,應該有錯誤 –

回答

4

你提到的報價是一種誤導:

  • 如果檢查的異常可以在你的方法體被拋出,你必須在方法的throws子句中聲明它。
  • 但您可以將的任何異常添加到方法的throws子句中,無論它是否可以實際拋出。

例如,這編譯:

public void m() throws IOException {} 
+0

'try塊實際上在某個時間點拋出了特定的異常.'這意味着 –

+0

我不知道,但它聽起來不正確。這篇文章具有誤導性,講述了Java 6已經有多年的EOL了 - 除非你正在從Java 6遷移到Java 7,否則我不會在該文本上花太多時間...... – assylias

1

我想你是誤會上下文中的文章,說明這種情況。該文章說,在Java 7中,throws子句中聲明ExceptionOK如果throws子句聲明,實際上是由try,即OpenExceptionCloseException拋出的異常。從某種意義上說,Java 7的編譯器現在足夠聰明,知道try塊只能拋出OpenExceptionCloseException塊。所以它不再要求該方法聲明throws Exception

這與IOException無關,它不會改變這樣一個事實,即無論是否可以拋出異常,都可以聲明拋出的異常。 throws子句只是方法API的一部分。

文章中規定的條件的全部意義在於以下幾點:

public static void main(String args[]) throws OpenException, CloseException, 
               java.io.IOException 
{ 
    boolean flag = true; 
    try 
    { 
     if (flag) 
     { 
      throw new OpenException(); 
     } 
     else 
     { 
      throw new CloseException(); 
     } 
    } 
    catch (Exception e) 
    { 
     System.out.println(e.getMessage()); 
     throw e;  // this causes a compilation error before Java 7 
    } 
} 

編譯Java 7中而不是在Java 6中。

+0

'不會在如果throws子句聲明一個異常,throws子句是​​可以的,請解釋一下。 –