標籤:類型 檢測 調用 catch 方式 方法 .sh 異常捕獲 gpo
一 finally1.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 |--BExceptionclass 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-異常進階-包的使用