1. 程式人生 > >java-異常進階-包的使用

java-異常進階-包的使用

too extends 跳轉 資源釋放 [] 也有 問題 子集 類的方法

一 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-異常進階-包的使用