2013-04-16 96 views
2

我有一些代碼段:什麼時候必須圍繞try/catch?

public static void a() throws NumberFormatException { 
     return; 
    } 

    public static void b() throws InterruptedException{ 
     return; 
    } 

    public static void main(String[] args) { 

     a(); 
     b(); 

    } 

而Eclipse的說,我有包圍的try/catch到函數調用B(),但我沒有這樣做,有()調用。爲什麼?調用時如何使函數使試圖捕獲環繞?

+3

看看在Java中檢查與未檢查的異常 - http://www.javapractices.com/topic/TopicAction.do?Id=12 –

回答

5

因爲InterruptedException是一個檢查異常,並且NumberFormatException是未選中的表示。

對於檢查的異常,編譯器強制要麼用try-catch塊將它們包圍,要麼用throws聲明它們,而對於未檢查的異常try-catch塊不是強制性的。

由於功能a()拋出NumberFormatException(未經檢查的異常)編譯器不會強迫你包圍函數調用try-catch

作爲函數b()引發InterruptedException(檢查異常)編譯器強制您使用try-catch圍繞函數調用或聲明它們使用throws

+0

編譯器不會強制你圍繞在這種情況下使用try-catch檢查異常。你也可以重新拋出它:'public static void main(String [] args)throws InterruptedException' – Puce

+0

你是對的,我會更新我的答案,它應該是'catch'或者聲明爲'throws' – Apurv

2

NumberFormatException不是檢查異常(即因爲它具有java.lang.RuntimeException作爲其基類),這意味着開發人員不會被迫處理(開發人員選擇是否處理它)開發人員選擇不處理異常,如果發生異常,它將由JVM處理。

其中InterruptedException(即,因爲它的java.lang.Exception作爲其基類)是一個檢查異常,這意味着開發人員必須每次使用try-catch塊或通過聲明異常來處理它在Throws子句中。

看看這個example

+1

和「user」我想,他的意思是「開發者」。 –

+0

是的,那正是我的意思。我會糾正它。 – codeMan

1

這是因爲NumberFormatException延伸RuntimeException - 即它是unchecked例外。雖然InterruptedExceptionchecked例外 - 它應該在try...catch區塊中被捕獲,或者您應該添加throwsmain()方法。

1

因爲NumberFormatException()是未經檢查的異常InterruptedException被選中,你必須用try-catch檢查異常,但是你不必try-catch檢查 - 每個方法都會有try-catch。

0

public class InterruptedException extends exception 在活動之前或活動期間,線程正在等待,休眠或以其他方式佔用以及線程中斷時拋出。偶爾一個方法可能希望測試當前線程是否被中斷,如果是,立即拋出這個異常。

但是對於第一種情況,它不會詢問NumberFormatException是未經檢查的表達式。

0

所有Exception延伸RuntimeException不暗示明確的try-catch塊。他們被稱爲Unchecked。理論上這些異常保留給VM引發的不可恢復的運行時錯誤。然而,他們現在很常用,因爲很多人都同意說異常機制是一個糟糕的設計概念。

當您的程序無法從錯誤中恢復並讓它們傳播到橫向層異常處理時,您將通常使用Unchecked,這將處理負責將錯誤正確記錄和/或顯示給用戶。

檢查異常通常用於調用者需要處理錯誤的情況,因爲它可以從中恢復或觸發特定行爲。

0

關鍵字throws聲明一個方法可能拋出該異常。雖然檢查異常必須用未經檢查的異常來處理,但這是可選的。在你的情況下,拋出一個根據定義的未經檢查的異常從RuntimeException的是派生的NumberFormatException,看到Section 11.2: Compile-Time Checking of Exceptions

的unchecked異常類是類的RuntimeException和 它的子類,類錯誤和其子類。所有其他 異常類都是檢查異常類。

而根據定義,B類拋出的InterruptedException是一個檢查異常(必須在try-catch塊中捕獲)。

0

在Java中兩種方式來處理異常 -

1. surround try/catch 
2. propagate exeption 

您使用try/catch塊,如果你想在本地處理這個異常。基本上,在try塊內有一個有可能拋出異常的代碼。

但如果你想這可能exceptioncalling method處理您使用throws SomeException方法簽名......這calling method還可以進一步傳播這一exception起來......應該都從未方法本try/catch例外,這將是拋出的Java Virtual Machineexecution time

相關問題