java-異常進階-包的使用
一 finally
1.1 異常執行的順序
package test; public class Test { public static void main(String[] args) { Demo d = new Demo(); try { d.show(-5); System.out.println("hello try"); } catch (NoShowException e) { e.printStackTrace(); System.out.println("hello catch"); } } } class NoShowException extends Exception { NoShowException(String message) { super(message); } } class Demo { void show(int num)throws NoShowException { if(num<0) throw new NoShowException(num+",數值是非法的"); System.out.println("show ....."+num); } }
結果:
1.2 finally 作用
有一些特定的代碼無論異常是否發生,都需要執行。
因為異常會引發程序跳轉,導致有寫語句執行不到。無法滿足這個需求。
異常捕獲處理時java提供解決方案。
應用場景;
定義一個功能往數據庫中添加數據。 void add(Data data)throws NoAddException { //1,連接數據庫。 try{ //2,添加數據。//添加數據時發生了異常情況。throw new SQLException();程序跳轉,就執行不到斷開連接。//而斷開連接必須要執行,因為不執行,連接資源在浪費。 //無論是否發生問題,都需要執行斷開連接的動作,從而釋放資源。 }catch(SQLException e) { //解決數據庫的問題。 //同時將問題告訴調用者。 throw new NoAddException(); } finally { //3,斷開連接。 } }
總結:finally到底什麽時候用?
只要程序中使用到了具體的資源(數據庫連接,IO資源,網絡連接socket等)
需要釋放,都必須定義在finally中。你在定義程序,只要問題發生與否,
指定程序都需要執行時,就定義finally中。
二 異常的組合方式
try catch finally 組合方式:
1 .try catch : 對代碼進行異常檢測,並對檢測的異常傳遞給catch處理。
try catch : 對代碼進行異常檢測,並對檢測的異常傳遞給catch處理。 異常捕獲處理。 void show()//不用throws { try{ throw new Exception(); }catch(Exception e) { } }
2. try finally : 對代碼進行異常檢測,檢測到異常後因為沒有catch,所以一樣會被默認jvm拋出。
異常是沒有捕獲處理的。但是功能所開啟資源需要進行關閉,所有finally。
只為關閉資源。
void show()//需要throws { try{ throw new Exception(); }finally { } }
3,
try catch finally
檢測異常,並傳遞給catch處理,並定義資源釋放。
4,try catch1 catch2 catch3......
class ExceptionDemo10 { public static void main(String[] args) { System.out.println("Hello World!"); } }
三 異常在繼承或實現的細節
異常在繼承或者實現中的使用細節:★★★★★
1,子類覆蓋父類方法時,如果父類的方法聲明異常,子類只能聲明父類異常或者該異常的子類,或者不聲明。
2,當父類方法聲明多個異常時,子類覆蓋時只能聲明多個異常的子集。
3,當被覆蓋的方法沒有異常聲明時,子類覆蓋時時無法聲明異常的。
舉例:父類存在這種情況,接口也有這種情況,
問題:接口中沒有聲明異常,而實現的子類覆蓋方法時發生了異常,怎麽辦?
無法進行throws聲明,只能catch的捕獲。萬一問題處理不了呢?catch中繼續throw拋出,但是只能將異常轉換成RuntimeException子類拋出。
1,子類覆蓋父類方法時,如果父類的方法聲明異常,子類只能聲明父類異常或者該異常的子類,或者不聲明。
原因:如是不是這樣,會發生類型轉換異常.具體看下面代碼講解
下面紅色部分產生類型轉換異常 //AException ex = new BException();
ps:父類有問題了,在覆蓋的時候子類不能有更多的問題
Exception |--AException |--AAException |--BException class AException extends Exception { } class BException extends Exception { } class AAException extends AException { } class Fu { void show() { } } class Tool { void method(Fu f)//Fu f = new Zi(); { try { f.show(); } catch (AException ex)//AException ex = new BException(); { } } } Tool t = new Tool(); //t.method(new Fu()); t.method(new Zi()); class Zi extends Fu { void show()throws BException
{ } }
四 包
java-異常進階-包的使用