2013-06-26 63 views
4

我想知道的Java是如何發生以下情形拋出異常並捕獲異常?

public static void main(String[] args) throws IndexOutOfBoundsException, CoordinateException, MissionException, SQLException, ParserConfigurationException { 
    try { 
     doSomething(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

在上面的代碼中,我聲明的主要功能是引發許多不同的例外,但裏面的功能,我捕捉通用的異常。我想知道如何java內部?也就是說,doSomething()會拋出一個IndexOutOfBounds異常,e.printStackTrace()會在最後的catch (Exception e) {...}塊中被調用嗎?

我知道如果沒有在函數的throws區域中聲明的異常被引發,try/catch將處理它,但是在聲明中提到的異常呢?

回答

3

該catch塊有更高優先級在方法級拋出聲明。如果有什麼東西會通過該catch塊,它會被該方法拋出(但事實並非如此,因爲你提到的所有異常確實是從Exception繼承的)。

如果您需要catch塊處理異常但進一步轉發的異常,則必須重新拋出異常。

throw e; 
5

在你的情況下,如果在doSomething()引發或生成任何異常,它將被捕獲在try-catch塊中,因爲你正在捕獲Exception e

Exception是所有異常的。所有異常繼承自該類。

+4

+1只'Error'等'Throwable'都沒有抓到。 –

+0

事情是,有時我會希望它在try/catch中處理,然後拋出。在這種情況下,我應該在異常結束時執行'throw e;'操作嗎? –

+0

yeap,不要忘記,你可以創建自己的異常,並可能在catch塊中拋出它們。這就是所謂的鏈式異常http://docs.oracle.com/javase/tutorial/essential/exceptions/chained.html – MaVRoSCy

1

說DoSomething的()拋出一個異常IndexOutOfBounds,將 e.printStackTrace()獲取在最後趕上(例外五)稱爲{...} 塊?

是的,e.printStackTrace()將被調用。因爲你已經發現了Exception,它比(或者直接或者間接超類)IndexOutOfBoundException或者其他任何拋出throws子句的異常都要寬泛。但是如果你發現一些比IndexOutOfBoundException窄的異常,並且在throws子句中遇到其他異常,並且遇到任何這些異常,那麼throws子句將會觸發。

0

假設你有這樣的代碼:

try{ 
     doSomething(); 
    }catch(Exception ex){ 
     System.out.println("Exception:"); 
     ex.printStackTrace(); 
    }catch(IndexOutOfBoundsException ex){ 
     System.out.println("IndexOutOfBoundsException :"); 
     ex.printStackTrace(); 
    } 

你會得到一個編譯錯誤說

異常IndexOutIfBounds已經被抓

這是因爲每例外繼承自Exception類,因此catch塊捕獲的第一件事是Exception,因爲IndexOutOfBounds是一個Exception,因此不需要爲它的第一個和第二個捕獲它兩次。
在一種情況下,當您在throws或try-catch後沒有聲明異常類時,拋出將會執行其工作。