簡體   English   中英

每個例外都有必要的試用嗎?

[英]Does every exception have an required try-catch?

一個簡單的問題,我找不到答案。 Java中的每個異常都需要使用try-catch嗎? 或者僅適用於FileNotFoundException?

很多異常(IndexOutOfBoundException,ArithmeticException,IlligalArgumentException,NullPointerException)都表示他們不需要Exception,但是FileNotFoundException會這樣做...而且我找不到答案,哪些不需要try-catch 。

對於您的異常,並不是絕對需要try/catch塊。 相反,您可以throw它們throw能夠正確處理異常的人。

有兩種例外:已選中和未選中。 Checked異常可以被認為是編譯器找到的異常,並且編譯器知道它有可能發生,所以你需要catchthrow它。 例如,打開文件。 它有可能失敗,編譯器知道這一點,所以你不得不catchthrow可能的IOException

未經檢查的異常可被視為有可能發生的異常,但基於您的代碼,編譯器不知道。 換句話說,這是一個編程錯誤 例如,如果您正在接受用戶輸入並期望一個數字,並且用戶輸入了您不期望的內容(例如字符串),則您的程序將拋出NumberFormatException 您可以預測這些場景並將try/catch為在它們發生之前嘗試避免它們。 很少見到一個人添加一個throws NullPointerExceptionthrows NumberFormatException (或拋出任何其他未經檢查的異常,就此而言)。 這是允許的,但明確地創建該異常是很奇怪的,並且大多數人會說這是不好的編碼風格。

請注意,所有Checked建議必須被捕獲或拋出到可以處理它的東西; 如果你不這樣做,你的程序將無法編譯。 如果你把它扔到無法處理的東西上,那么你的程序如果發生就會崩潰。

另請注意,未經檢查的異常(例如:在運行時發生的異常,通常是通過錯誤的用戶輸入或諸如此類)也會導致程序崩潰。 因此,當某些東西可能出錯時使用try/catch通常是個好主意,但是你不必這樣做

另外值得注意的是,Checked異常是Exception的子類,Unchecked異常是RuntimeException的子類,RuntimeException本身是Exception的子類。 這意味着如果你真的想要,一個try {} catch (Exception e) {}將捕獲你的程序可能拋出的每個異常。 當然,這被認為是處理異常的可怕方式,您應該分別捕獲每個異常,以便您可以單獨處理它們。 請盡量不要使用它。

不,並非每個例外都需要試一試。 每個檢查過的異常都需要try catch。 例如,NullPointerException是一個未經檢查的異常,因此它不需要try-catch,而是檢查FileNotFoundException,因此它確實需要一個。 您還可以向方法簽名添加“throws”,從而避免需要try-catch。

閱讀: https//docs.oracle.com/javase/tutorial/essential/exceptions/

基本上檢查的異常需要處理或拋出可以處理或拋出未經檢查的異常和錯誤(盡管處理錯誤通常被認為是不好的做法)。

檢查異常是從java.lang.Exception繼承的所有內容

未經檢查的異常是從java.lang.RuntimeException繼承的所有內容

錯誤是從java.lang.Error繼承的所有內容

只有Checked異常顯式需要捕獲它,對於其他所有類型的異常,您可以使用“throws”方法簽名。

是的,但是如果您不想在方法中處理它,可以使用throws關鍵字將異常傳遞給方法的調用者。 例:

void execption() throws Exception {
    throw new Exception();
}

void caller() {
    try {
        execption();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

編輯:我在我的java上有點生疏,就像josh說你可以擁有不需要像NullPointerException那樣的try / catch的未經檢查的異常,但如果你認為可能會拋出未經檢查的異常,你可以添加一個。 例:

Object obj = null;

obj.hashCode();// if you think a NPE will be thrown you can use a try/catch here

當您調用的方法顯式拋出異常時,您必須使用try....catch循環。 但是,如果您給出的列表都是運行時異常。 當有時某個程序有不期望的輸入或程序被用於某些不適合的用途時,它們會被拋出。 這些不需要try....catch循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM