在JAVA中,如果某個方法不能夠按照正常的途徑完成它的任務(wù),就可以通過另外一個途徑退出方法。在這種情況下,方法并不立刻返回,而是拋出一個封裝了錯誤信息的對象。需要注意的是,這個方法將會立刻退出,且并不返回正常情況下的值。此外,調(diào)用這個方法的代碼也將無法執(zhí)行,取而代之的是,異常處理機制開始搜索能夠處理這種錯誤條件的異常處理器。 如果在子類中覆蓋了超類的一個方法,那么子類方法聲明的已檢查異常不能超過超類方法中聲明的異常圍。(也就是說子類中拋出的異常范圍更小或者根本不拋出異常)。需要說明的是,如果超類方法沒有拋出任何異常,子類也不能拋出任何已檢查異常。例如,如果覆蓋JComponent.paintComponent()方法,那么 由于超類中沒有拋出任何異常,所以自定義的paintComponent()方法也不能拋出任何異常。 如何拋出異常: 譬如在讀一個輸入流時,如果期待的字節(jié)數(shù)為1024,而當(dāng)讀到700字節(jié)的時候遇到一個EOF信號,這是我們未預(yù)期的,正是我們要拋出的異常,下面就是拋出改異常的語句
這是拋出已存在標(biāo)準(zhǔn)的異常,步驟為: 1.找到一個合適的異常類 2.創(chuàng)建該類的對象 3.將異常拋出 一旦拋出異常,該方法就不可能返回到調(diào)用者,這就意味著不必為返回的默認(rèn)值或錯誤代碼擔(dān)憂了。 在程序中可能會遇到任何標(biāo)準(zhǔn)異常都無法正確描述清楚的問題,這時候就需要定義自己的異常類,定義自己的異常類需要繼承自Exception 或者其子類,如繼承自IOException 一般要為自定義的Exception定義兩個構(gòu)造函數(shù),一個是默認(rèn)的無參的構(gòu)造函數(shù),另一個是帶一個描述詳細錯誤信息String的構(gòu)造函數(shù)(超類的toString()方法會打印出這些詳細信息。
現(xiàn)在就可以像使用標(biāo)準(zhǔn)Exception類一樣使用自定義的Exception類了
可以用超類Throwable類的getMessage方法得到詳細的錯誤描述信息?;蛘遲oString()方法打印該信息。 捕獲異常: 如果語句exp1有可能拋出一個異常,或者說是調(diào)用了能夠拋出一個異常的方法,那么我們可以在程序中捕獲該異常
或者是并不捕獲,再次拋出該異常 再次拋出異常,異常鏈: 可以在catch塊中再次拋出新的異常,這樣可以隱藏原始的錯誤細節(jié)
另一種更好的方法 既拋出高級的異常,又不會丟失原始的異常信息。
finally子句,發(fā)生三種情況時,會執(zhí)行finally子句 1.try代碼正常執(zhí)行 2.try代碼拋出一個在catch子句中捕獲的異常 3.try代碼拋出一個未在catch子句中捕獲的異常 就是說無論異常如何,finally子句中的代碼都會執(zhí)行 一般把一些資源回收的工作交給finally子句 最好把try-catch塊和try-finally塊分開,這樣可以提高代碼的清晰度
這樣的另外一個好處是,可以catch到finally子句中拋出的異常。這也就引發(fā)了另外一個問題,如果在try和finally中都拋出了異常,而且是不同類型的,那么最后返回的是那一個呢?答案是finally中拋出的異常會覆蓋try中拋出的異常。從而丟失了try當(dāng)中拋出的異常信息,讓拋出該方法的使用者不能跟蹤異常信息。所以,在finally中執(zhí)行的語句最好是不要拋出異常,但是不幸的是我們有時候不得不在finally中執(zhí)行一些清楚操作如:關(guān)閉輸入流InputStream,但是InputStream類的設(shè)計者并沒有這么設(shè)計(將會拋出異常)。 由于finally子句總是會執(zhí)行,所以在finally中包含return值時,是很危險的。假設(shè)我們利用return語句從try中返回,在方法返回之前finally子句的內(nèi)容將會被執(zhí)行。如果finally子句當(dāng)中也包含一個return 語句,那么這個return語句所返回的值,將會覆蓋原先return的值。
在這里如果調(diào)用i=f(2);那么i的值將會是2而不是期望的2*2=4 最后最重要的一點,關(guān)于一個方法是捕獲一個異常還是拋出給調(diào)用他的方法 有一點規(guī)則 早拋出,晚捕獲,盡量把異常拋出給調(diào)用它的函數(shù)
posted on 2008-02-26 14:05 曉宇 閱讀(528) 評論(0) 編輯 收藏 所屬分類: JAVA基礎(chǔ)
Powered by: BlogJava Copyright © 曉宇