2013-10-22 134 views
5

我注意到,這兩個,例如,正在努力:我應該什麼時候宣佈「拋出」,什麼時候不拋出?

public void func(int a) throws IllegalArgumentException { 
    if(a < 0) 
     throw new IllegalArgumentException("a should be greater than 0."); 
} 

public void func(int a) { 
    if(a < 0) 
     throw new IllegalArgumentException("a should be greater than 0."); 
} 

這讓我問:

我應該什麼時候宣佈throws anException,當沒有了,只是把它沒有宣佈這件事?

回答

4

檢查異常必須始終寫在方法簽名中,它必須寫入throws

如果例外extend RuntimeException,你沒有方法名寫throws,但它強烈建議,因爲它更清晰,它會方法的文件中被提及。

/** 
* @throws This won't appear if you don't write `throws` and this might 
* mislead the programmer. 
*/ 
public void func(int a) throws IllegalArgumentException { 
    if(a < 0) 
     throw new IllegalArgumentException("a should be greater than 0."); 
} 
2

JLS section 11.2

Java編程語言要求程序包含 處理程序檢查的異常,這會導致從 方法或構造函數的執行。對於可能的 結果中的每個檢查異常,方法(第8.4.6節)或構造函數 (第8.8.5節)的throws子句必須提及該異常的類別或該類別的其中一個 超類例外(§11.2.3)。

如此簡單,你需要的throws聲明如果一個例外是檢查。如果你有一個Exception,並且它不是RuntimeException的子類,那麼就檢查它。

IllegalArgumentExceptionRuntimeException的子類,所以它沒有選中,你不需要在throws語句中聲明它。大多數例外情況(例如IllegalArgumentException,NullPtrException等)都是如此,因爲您無法合理預期輕鬆處理這些情況。

1

當你的異常被選中時,你有責任編譯器捕獲異常或宣佈拋出聲明。
檢查this後的比較檢查與未檢查的例外。

2

Throw的美妙之處在於Exception將轉換爲Checked Exception,因此每次任何開發人員嘗試使用第一種方法時,他都會被警告在調用其簽名中具有Throws的方法之前放置try-catch塊。

1

這是因爲IllegalArgumentException extends RuntimeException。如下例所示,你不能在下面拋出throws子句。

public void func(int a) { 
    if(a == 0) 
     throw new Exception("a should be greater than 0."); 
} 
1

已經有許多技術性的答案是JLS 1.2節,經過異常等,這說明了它的使用。
但你的問題

我應該什麼時候宣佈拋出一個異常,而當沒有,只是把它沒有宣佈呢?

如果您的代碼生成一些明確的異常,並拋出它,那麼你應該時時補充 throws子句,你應該僅通過寫生成文檔/**將產生的文檔標籤上面的函數您。 這將幫助所有誰使用資料庫或將某些功能或構造,勢必引發異常,如果一些無效參數或某些值尚未調用該函數之前初始化函數其他用戶。

/** 
* 
* @param filePath File path for the file which is to be read 
* @throws FileNotFoundException In case there exists no file at specified location 
* @throws IllegalArgumentException In case when supplied string is null or whitespace 
*/ 
public static void ReadFile(String filePath) throws FileNotFoundException, IllegalArgumentException 
{ 
    if(filePath == null || filePath == "") 
    throw new IllegalArgumentException(" Invalid arguments are supplied "); 
    File fil = new File(filePath); 
    if(!fil.exists()|| fil.isDirectory()) 
     throw new FileNotFoundException(" No file exist at specified location " + filePath); 
    //..... Rest of code to read file and perform necessay operation 
} 

這些文檔標記,並拋出是而且使程序員的生活輕鬆誰將會重用代碼,並會提前知道拋出:IllegalArgumentException,FileNotFoundException異常會被拋出,如果功能與調用錯誤的參數或文件不可用在指定的位置。

所以,如果你希望你的代碼和函數是自我解釋的,並提供所有必要的情況下拋出什麼異常然後添加以下條款,否則它是你的選擇。
記住,如果在30天之後,如果你自己使用(我相信你會重新使用它不遠的將來)那些函數,那麼這將是更有益的,將會精確地只是通過這些條款明白我在那個功能上做了。

相關問題