JAVA_1 異常處理

1.異常的概念

在程序開發過程中,可能存在各種錯誤,有些錯誤是可以避免的,而有些錯誤卻是意想不到的,在Java中把這些可能發生的錯誤稱爲異常。

2.異常的分類

在Java中可以捕獲的異常(即Exception類的子類)可分爲可控式異常和運行時異常兩種類型。

2.1 可控式異常

在Java中把那些可以預知的錯誤,例如從文件中讀取數據、對數據庫進行操作等,在程序編譯時就能對程序中可能存在的錯誤進行處理,並給出具體的錯誤信息,這種爲可控式異常。

可控式異常類型

2.2 運行時異常

在Java中有些錯誤是不能被編譯器檢測到的,例如,在進行除法運算時,除數爲零;試圖把一個不是由數字組成的字符串使用Integer類的parseInt()方法轉化爲 整數等,Java的編譯器是檢測不到的,因而能夠正常編譯,但是在 運行時就會發生異常,這些稱爲運行時異常。

運行時異常類型

常見異常 例:

1.算數異常

ArithmeticException
x/0

2.數組下標越界異常

ArrayIndexOutOfBoundsException
數組元素下標值大於數組最大下標值

3.空指針異常

java.lang.NullPointerException
當指針爲空時,對此方法進行調用,產生空指針異常 String s=null; s.name;

3.獲取異常信息

在Java中java.lang.Throwable類是所有異常類的超類,該類提供了獲得異常信息的方法。

獲取異常信息的方法

4.處理異常

4.1 使用try···catch處理異常

try{
    需要正常執行的語句
}catch(Exception ex){
    對異常進行處理的語句
}

1.try和catch是進行異常處理的關鍵字。
2.try和catch之間的兩個大括號內是程序需要正常執行但又可能發生異常的語句。
3.catch後的兩個小括號內是程序需要處理的異常類型。
4.catch後的兩個大括號內是對程序發生的異常進行處理的語句。

4.2 使用try···catch···finally處理異常

try{
    需要執行的語句
}catch(Exception ex){
    對異常進行處理的語句
}finally{
    一定會被執行的語句
}

要點與try···catch基本相同

finally語句塊通常用於執行垃圾回收、釋放資源等操作。

4.3 使用try···finally處理異常

try{
    需要執行的語句
}finally{
    一定會執行的語句
}

5.拋出異常

5.1 使用throws聲明拋出異常

數據類型  方法名(形參列表)  throws 異常類1,異常類2,···,異常類n{
    方法體;
}

1.數據類型是基本數據類型或對象類型。
2.方法名是Java語言的合法標識符。
3.throws是拋出異常的關鍵字。
4.異常類是Java語言的異常類 或自定義異常類。
5.方法體是該方法需要執行的語句。

5.2 使用throw語句拋出異常

程序自行拋出異常,使用throw語句來實現。通常用在方法中,if語句一起使用,拋出異常類的實例。

if(出現異常的條件){
    throw new Exception("對異常的說明");
}

1.throw是拋出異常關鍵字
2.Exception是異常類(通常使用自定義異常類)。

例:

方法中拋出異常

public class ThrowException{
    public static void throwException(){
        throw new UnsupportedOperationException("方法尚未實現");  //拋出異常
    }
    public static void main(String[] args){
        ThrowException.throwException();                        //調用拋出異常的方法
    }
}

方法上拋出異常

public class ThrowsException{
    public static void throwsException() throws ClassNotFoundException{    //拋出異常
        Class.foeName("com.mysql.jdbc.Driver");
    }
    public static void main(String[] args){
        try{                                     //捕獲異常
            ThrowsException.throwsException();   //調用拋出異常的方法
        }catch(ClassNotFoundException e){
        e.printStackTrace();
        }
    }
}

6.自定義異常

6.1 創建自定義異常類

創建自定義的異常類需要繼承自Exception類,並提供含有一個String類型的形參的構造方法,該形參就是異常的描述信息,可以通過getMessage()方法獲得。例如:

public class NewException extends Exception{
    public NewException(String s){
        super(s);
    }
}

上面的代碼創建了一個名爲 NewException的自定義異常類,該類繼承自Exception類,該類構造方法的形參s 是需要傳遞異常描述 信息。該信息可以通過getMessage()方法獲得。

6.2 使用自定義異常類

創建完自定義異常類後,就可以在程序中使用,使用自定義異常類可以通過throw語句拋出異常。例:

public class NewException extends Exception{  //創建自定義異常類
    publicNewException(Double r){             //有一個Double類型的形參的構造方法
        System.out.println("發生異常:圓的半徑不能小於20");
        System.out.println("圓的半徑爲:"+r);
    }
}

7.異常的使用規則

  1. 不要過多的使用異常,這樣會增加系統的負擔。
  2. 在方法中使用try···catch語句塊捕獲異常時,要對異常作出處理。
  3. try···catch語句塊的範圍不要太大,這樣會不利於對異常的分析。
  4. 一個方法被覆蓋時,覆蓋它的方法必須拋出相同的異常或者子異常。

8.經典範例

8.1 捕獲單個異常

例:

public class CatchException{
    public static xoid main(String[] args){
        try{                                        //定義try語句塊
            System.out.println("進入try語句塊");
            @SuppressWarnings("unused")
            Class<?>clazz = Class.forName("");      //得到一個空的Class對象
            System.out.println("離開try語句塊");
        }catch(ClassNotFoundException e){           //定義catch語句塊
            System.out.println("進入catch語句塊");
            e.printStackTrace();
            System.out.println("離開catch語句塊");
        }finally{                                   //定義finally語句塊
            System.out.println("進入finally語句塊");
        }
    }
}

8.2 數據庫操作異常

public classExceptionTest{
    public static void main(String[] args){
        String URL = "jdbc:mysql://localhost:3306/db_database";  //MySQL數據庫的URL
        String DRIVER = "com.mysql.jdbc.Driver";     //MySQL數據庫的驅動
        String USERNAME = "mr";                      //數據庫的用戶名      
        Connrction connection = null;
        try{
            Class.forName(DRIVER);                   //加載驅動
            //建立連接
            connection = DriverManager.getConnection(URL,USERNAME,"");
        }catch(SQLException e){                      //捕獲SQLException
            e.printStackTrace();
        }catch(ClassNotFoundException e){            //捕獲ClassNotFoundException
            e.printStackTrace();
        }finally{
             try{
                 connection.close();                 //釋放資源
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章