1. 程式人生 > 實用技巧 >Java中的異常及異常處理方法

Java中的異常及異常處理方法

前言:

  本文主要討論Java中的異常,因為java是一種強型別語言,其中的異常處理和Python語言中的異常處理還是有些許區別!!!

目 錄

一、異常

二、JVM 預設的異常處理

三、異常處理之 Try...catch...

四、Throwable 的成員方法

五、編譯型異常和執行時異常

六、異常處理之Throws

七、自定義異常類

一、異常

異常:就是程式出現不正常的情況

案例如下:

package itheima2;

public class ExceptionDemo {

    public static void main(String[] args) {
        
// 呼叫方法 test(); } //定義方法 -- 注意:自定義方法必須有static修飾,但是自定義類中的方法不需要static 修飾 public static void test() { int[] arr = {1, 2, 3}; System.out.println(arr[3]); //超出陣列索引範圍, } /* 報錯資訊: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at itheima2.ExceptionDemo.test(ExceptionDemo.java:14) at itheima2.ExceptionDemo.main(ExceptionDemo.java:7)
*/ }

二、JVM 預設的異常處理

// 如果程式出現了問題,我們沒有解決。那麼Java虛擬機器JVM就會做預設處理

// 處理包括兩個步驟:

/*
   1、將異常的名稱、異常的原因和異常的位置輸出在控制檯
   2、停止程式的執行  
/*

三、異常處理之 Try...catch...

異常處理通常有兩種方法:

  Try ... catch.. 和 Throws

Try .. catch .. 格式及執行流程:

// try ...catch...異常處理
/*
         格式:
            try {
                可能出現異常部分的程式碼;
            } catch(異常類名  變數名) {
                異常的處理程式碼;
            }
        執行流程:
            從try裡面的程式碼開始執行,出現異常後會生成一個異常類物件,並且將這個異常類物件交給java執行時系統;
            java執行時系統會去catch中找匹配的異常類物件進行異常處理;
            執行完異常處理的程式碼後程序會向下繼續執行!!!
*/

案例:

package itheima2;

// try ...catch...異常處理
/*
         格式:
            try {
                可能出現異常部分的程式碼;
            } catch(異常類名  變數名) {
                異常的處理程式碼;
            }
        執行流程:
            從try裡面的程式碼開始執行,出現異常後會生成一個異常類物件,並且將這個異常類物件交給java執行時系統;
            java執行時系統會去catch中找匹配的異常類物件進行異常處理;
            執行完異常處理的程式碼後程序會向下繼續執行!!!
*/
public class ExceptionDemo1 {

    public static void main(String[] args) {
        // TODO 方法呼叫
        test();

    }
    
    public static void test() {
        try {
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]);  //超出陣列索引範圍,
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("索引錯誤,索引值超出陣列的索引範圍");
        }
    }

}

四、Throwable 的成員方法

Throwable 類是所有異常類的父類!如下圖所示:

Throwable類成員方法及案例如下:

package itheima2;

/*
 * Throwable 的成員方法, Throwable 類是 所有異常類的父類
 *         public String getMessage()  返回throwable的詳細資訊字串
 *         public String toString()    返回可丟擲的簡短描述(原因)
 *         public void printStackTrace()  將異常資訊輸出在控制檯
 * 
 */
public class ExceptionDemo2 {

    public static void main(String[] args) {
        // TODO 
        System.out.println("開始:");
        test();
        System.out.println("結束:");
    }
    
    public static void test() {
        try {
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]);  //超出陣列索引範圍,
        } catch (ArrayIndexOutOfBoundsException e) {
//            System.out.println("索引錯誤,索引值超出陣列的索引範圍");
            
            //public String getMessage()  返回throwable的詳細資訊字串
            System.out.println(e.getMessage());
            
            //public String toString() 
            System.out.println(e.toString());
            
            //public void printStackTrace()  將異常資訊輸出在控制檯----最常用方法
            
            e.printStackTrace();  //注意:呼叫printStackTrace方法時會直接打印出字串,沒有返回值;因此可以直接呼叫
            /*
             * e.printStackTrace()  執行結果如下,可以看出和jvm預設的異常處理一樣,但是程式不會終止,可以繼續向下執行;
             * java.lang.ArrayIndexOutOfBoundsException: 3
                        at itheima2.ExceptionDemo2.test(ExceptionDemo2.java:22)
                        at itheima2.ExceptionDemo2.main(ExceptionDemo2.java:15)
             */
        }
    }

}

五、編譯型異常和執行時異常

異常通常分為編譯時異常和執行時異常

//編譯時異常通常都是 Exception類及其子類,需要顯示處理,不然無法編譯無法執行

//執行時異常通常都是 RuntimeException類,不需要顯示處理

編譯時異常可以理解為:在程式碼編寫過程中程式碼飄紅,出現錯誤導致程式碼無法執行;

執行時異常可以理解為:程式碼在編寫過程中沒有出現錯誤,但是執行結果顯示錯誤。

具體案例如下:

package itheima2;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

// 編譯時異常和執行時異常
public class ExceptionDemo3 {

    public static void main(String[] args) {
        //
        method();
        method2();
        
    }
    
    //自定義方法
    public static void method() {
        int[] arr = {1, 2, 3};
        System.out.println(arr[3]);  //執行時錯誤: 編譯通過,結果報錯,可以直接在程式碼中修改
    }
    
    public static void method2() {
        try {
            String ss = "2020-10-09";
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date a = sdf.parse(ss);  // 編譯時錯誤:程式碼飄紅--
            System.out.println(a);
            } catch (ParseException e) {
                e.printStackTrace();
            }
    }
        
    
    /*
     * sdf.parse() 報錯資訊:包括錯誤原因和錯誤位置
     *         java.lang.Error: Unresolved compilation problem: 
                    Unhandled exception type ParseException
                
                    at itheima2.ExceptionDemo3.method2(ExceptionDemo3.java:25)
                    at itheima2.ExceptionDemo3.main(ExceptionDemo3.java:12)
     */
}

六、異常處理之Throws

一般的異常使用try catch來處理,但是當遇到一些超出許可權的異常時我們需要將異常丟擲,比如說將異常拋給方法的呼叫者,由方法的呼叫者進行異常處理!!!

/*
     throws 異常處理格式如下:
               public void 方法名() throws 異常類名{
          } 注意: 該格式放在方法()的後面
*/

案例如下:

package itheima2;

/*
    throws 異常處理方法
        格式:
            throws 異常類名
        注意: 該格式放在 方法()的後面。案例如下:
*/
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ExceptionDemo4 {

    public static void main(String[] args) {
        //
        method();
        //在方法呼叫的時候進行try catch 異常處理, 在方法編寫的時候用throws 異常類名  ,將異常丟擲
        try {
            method2();
        } catch(ParseException e) {
            e.printStackTrace();
        }

    }
    
    //執行時異常
    public static void method() {
        int[] arr = {1, 2, 3};
        System.out.println(arr[3]);  //執行時錯誤: 編譯通過,結果報錯,可以直接在程式碼中修改
    }
    
    
    //編譯時異常
    public static void method2() throws ParseException{
        
        String ss = "2020-10-09";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date a = sdf.parse(ss);  // 編譯時錯誤:程式碼飄紅--
        System.out.println(a);
            
    }

}

七、自定義異常類

自定義異常類就是繼承Exception類,並給出無參和帶參構造方法!

案例如下:

  自定義異常類:

package itheima2;

// 自定義分數異常類,繼承Exception類
public class ScoreException extends Exception{
    
    //有參無參構造方法
    public ScoreException(){}
    
    public ScoreException(String message) {
        super(message);
    }

}

  教師類:

package itheima2;

//自定義教師類
public class Teacher {
    
    //成員方法
    public void checkScore(int score) throws ScoreException {      //利用throws來丟擲異常,給方法呼叫者進行處理
        //執行判斷過程
        if(score < 0 || score > 100) {
            //丟擲異常資訊,可以無參方法也可以是帶參方法
//            throw new ScoreException();
            throw new ScoreException("給出的數值不在範圍內");
        } else {
            System.out.println("成績正常!");
        }
    
    }
}

  測試類:

package itheima2;

import java.util.Scanner;

public class TestDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入分數:");
        
        int score = sc.nextInt();
        
        //異常處理
        try {
            Teacher tt = new Teacher();
            tt.checkScore(score);
        } catch(ScoreException e) {
            e.printStackTrace();
        }

    }

}

/*
 執行結果如下:
    請輸入分數:
        111
        itheima2.ScoreException: 給出的數值不在範圍內
            at itheima2.Teacher.checkScore(Teacher.java:12)
            at itheima2.TestDemo.main(TestDemo.java:17)
*/