2017-10-17 107 views
2

我幾乎全新的Java編程,我試圖瞭解try和catch異常處理是如何運行的。Java - 如何嘗試和捕獲異常處理運行

我的疑問是,當我創建一個自定義的異常類,並將它放在主類的try塊中時,我可以實例化它而不用引用,但是當我編寫catch塊時,我可以使用成員沒有實例化它的同類實例化異常類。

例如:

public void main.....{ 

..... 

try{ 

    if(division==0){ 

     throw new DivisionByZero() ; 
     //Divisionbyzero is my customized exception class 

    } 

} 

catch(DivisionByZero e) { 

    e. methodDivisionByZero; 

} 

} 

的一點是,我可以直接使用電子部件不受新手段實例化。 當我拋出異常(即使我沒有在try塊中寫入任何引用)之前,e會以某種方式實例化嗎?

在此先感謝您的任何答案。

+1

好吧,當你說'拋出新的DivisionByZero'你會實例化那個自定義異常。 –

+1

當你定義一個catch塊時,你只是告訴編譯器哪種類型的異常將被捕獲,你沒有在那裏實例化它們。 –

回答

0

關於第一個問題我可以實例它不參考:這是沒有必要的情況下分配給任何引用變量。我們使用引用變量,以便將來可以使用它的成員。

而對於第二個問題我可以用一個成員的同類實例化異常類沒有實例化它:當你寫

throw new DivisionByZero() ;` this is equal to 
DivisionByZero dBZException = new DivisionByZero() ; 
throw dBZException; 

這意味着要傳遞一個實例在catch塊中你有參考變量DivisionByZero

因此,在catch塊你的代碼是這樣的:

DivisionByZero e = dBZException; 

希望它現在清楚了。

+0

非常有用! – Gianni

0

創建一個新的對象:

throw new DivisionByZero() ; 

投擲/捕獲只是一個 「運輸的平均值」。在「本質」,這就像寫:

DivisionByZero dbz = new DivisionByZero() ; 
dbz.someMethod(); 

您創建一個例外,你把「它」,你趕上「它」,然後「它」是什麼都沒有,但一些對象的引用。

+0

*投擲/捕捉只是一種「交通工具」。*好解釋 –

2

當引發異常時,將創建一個異常對象,並在try塊中不執行更多的行。該異常對象與catch塊參數相匹配,最適合的參數變量中的對象接收對象,就像方法參數一樣。在這種情況下,catch(DivisionByZero e)正確的catch子句應該是catch(ArithmeticException e)以捕獲被零除異常並且參數e是對異常對象的引用。

0

問題是,我可以直接使用e成員,而無需通過新的方式實例化它。

那麼你不需要這裏任何情況下,在catch塊類似的方法調用,我們傳遞一個**[reference][1]**,這裏對應當處理的異常的引用。

你可以看到,如果你看看The catch Blocks Oracle Docs

每個catch塊是一個例外處理程序,處理異常由其參數所指定的類型。參數類型ExceptionType聲明瞭處理程序可以處理的異常類型,並且必須是從Throwable類繼承的類的名稱。處理程序可以用名稱引用異常。

+1

感謝大家。 – Gianni

+0

非常有意義的答案。感謝你的回答,我在Java編程方面更有專長。 – Gianni

+0

@Gianni不客氣。 –