溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java異常處理機(jī)制實(shí)例分析

發(fā)布時(shí)間:2022-03-11 16:34:36 來源:億速云 閱讀:196 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Java異常處理機(jī)制實(shí)例分析”,在日常操作中,相信很多人在Java異常處理機(jī)制實(shí)例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java異常處理機(jī)制實(shí)例分析”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

異常處理機(jī)制的底層原理

  • 拋出異常,在執(zhí)行一個(gè)方法時(shí),如果發(fā)送了異常,則這個(gè)方法生成代表該異常的一個(gè)對象,停止當(dāng)前執(zhí)行的 路徑,并把異常提交給jre。

  • 捕獲異常:jre得到該異常后,虛招相應(yīng)的代碼來處理該異常。jre在方法的調(diào)用棧中查找,從生成異常的 方法開始回溯,直到找到相應(yīng)的異常處理代碼為止。

異常的繼承關(guān)系圖

Java異常處理機(jī)制實(shí)例分析

歐克,我們現(xiàn)在知道異常的定義是什么,那我們就應(yīng)該如何去捕捉異常,然后去處理異常。

異常的處理

一、try-catch-finally 結(jié)構(gòu)

首先我們先看一段代碼:

package AbnormalTest;

import java.util.InputMismatchException;
import java.util.Scanner;

public class test1 {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        try {
            System.out.print("請輸入被除數(shù):");
            int a = input.nextInt();
            System.out.print("請輸入除數(shù):");
            int b = input.nextInt();
            int sum = b/a;
            System.out.println("結(jié)果是:"+sum);
            System.out.println("程序無異常,執(zhí)行完畢!");
        }catch (Exception e){               //通用異常
        	//printStackTrace()方法是將堆棧異常的錯(cuò)誤信息打印出來(后期學(xué)習(xí)框架后我們一般提交或 者回滾事務(wù))
            e.printStackTrace();
            System.out.println("程序異常,請重試!");
            return ;
        }finally {
            //不管是否發(fā)生了異常,都會(huì)執(zhí)行finally內(nèi)的代碼,通常用于資源的關(guān)閉
            System.out.println("------------------------------");
            System.out.println("程序結(jié)束,資源已經(jīng)關(guān)閉,歡迎再次使用");
            input.close();   //關(guān)閉Scanner對象,節(jié)省資源
        }
    }

}

代碼解釋:

上述代碼中有try-catch-finally結(jié)構(gòu),他們分別的作用是什么?

try:我們把可能出現(xiàn)異常的代碼用try去包括起來

catch :只要try代碼塊里面的代碼運(yùn)行時(shí)發(fā)生了異常,就會(huì)進(jìn)入catch來捕捉異常

finally:不管之前代碼怎么執(zhí)行,都會(huì)執(zhí)行finally的代碼塊?。?/p>

運(yùn)行結(jié)果示例:

正常時(shí):

Java異常處理機(jī)制實(shí)例分析

異常時(shí):

當(dāng)被除數(shù)為0時(shí),將會(huì)觸發(fā)異常,進(jìn)入catah內(nèi)進(jìn)行捕捉,但是不管有沒有異常,都會(huì)執(zhí)行finally內(nèi)的程序輸出:程序結(jié)束,資源已經(jīng)關(guān)閉,歡迎再次使用

Java異常處理機(jī)制實(shí)例分析

二、多catch處理不同的異常:

我們知道,在一段代碼中可能不止一個(gè)異常,比如上述代碼,可能存在被除數(shù)為0的異常,也可能輸入字符進(jìn)行計(jì)算的輸入異常,或者可能存在數(shù)字格式化異常等等,這樣我們就可以使用多catch來捕捉異常:

還是以上面的代碼為例:

import java.util.InputMismatchException;
import java.util.Scanner;
public class test1 {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        try {
            System.out.print("請輸入被除數(shù):");
            int a = input.nextInt();
            System.out.print("請輸入除數(shù):");
            int b = input.nextInt();
            int sum = b/a;
            System.out.println("結(jié)果是:"+sum);
            System.out.println("程序無異常,執(zhí)行完畢!");

        }catch (InputMismatchException  e){                    //多重catch結(jié)構(gòu),這里捕捉輸入異常
            e.printStackTrace();
            System.out.println("程序輸入異常,請重試!");
        }catch (Exception e){                                 //這里捕捉通用異常(其他異常都可以在這里進(jìn)行捕捉)            
            e.printStackTrace();
            System.out.println("程序異常,請重試!");
            return ;
        }finally {
            //不管是否發(fā)生了異常,都會(huì)執(zhí)行finally內(nèi)的代碼,通常用于資源的關(guān)閉
            System.out.println("------------------------------");
            System.out.println("程序結(jié)束,資源已經(jīng)關(guān)閉,歡迎再次使用");
            input.close();   //關(guān)閉Scanner對象,節(jié)省資源
        }
    }

}

當(dāng)輸入不是為數(shù)字的時(shí)候:

Java異常處理機(jī)制實(shí)例分析

這樣我們可以看出,在第一個(gè)catch內(nèi)就已經(jīng)捕捉到了

三、throws 聲明異常/throw 拋出異常:

假設(shè)我定義了一個(gè)方法,告知該方法可能會(huì)發(fā)送某種異常(聲明異常),調(diào)用者調(diào)用該方法的時(shí)候就務(wù)必要對該異常進(jìn)行處理。

首先我們定義一個(gè)錯(cuò)誤類:

學(xué)生類:

package ExceptionText;

/**
 * 異常測試
 */

public class Student {

    private String name;
    private int age;
    private char sex;


    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public char getSex() {
        return sex;
    }

    public void setAge(int age) throws Exception {
        if (age < 101 && age > 0) {
            this.age = age;
        } else {
            throw new Exception("年齡輸入有誤!");
        }
    }
    public void setSex(char sex) throws Exception {
        if (sex == '男' || sex == '女') {
            this.sex = sex;
        } else {
            throw new Exception("性別輸入有誤");
        }

    }
}

測試類:

package ExceptionText;

public class TestMain {
    public static void main(String[] args) {

        Student stu = new Student();
        stu.setName("小紅");
        try {
            stu.setAge(50);
            stu.setSex('k');
            System.out.println("我叫:"+stu.getName()+"年齡:"+stu.getAge()+"我的性別是:"+stu.getSex());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

當(dāng)出入都正確的時(shí)候:

Java異常處理機(jī)制實(shí)例分析

當(dāng)年齡輸入不正確的時(shí)候:

Java異常處理機(jī)制實(shí)例分析

當(dāng)性別輸入不正確的時(shí)候:

Java異常處理機(jī)制實(shí)例分析

注意:如果存在多個(gè)異常,那么會(huì)拋出第一個(gè)出現(xiàn)的異常。

四、自定義異常:

當(dāng)RuntimeException的運(yùn)行時(shí)異常的子類無法滿足我們的需求的時(shí)候,我們也可以自定義運(yùn)行時(shí)異常和拋出自定義的異常信息來滿足我們的需求,但是要注意:自定義的運(yùn)行時(shí)異常要繼承RuntimeException!?。?/p>

自定義異常類:

//這個(gè)類是繼承了RuntimeException
public class AgeException extends RuntimeException {
   //構(gòu)造方法
   public AgeException(String message) {
       super(message);
   }
}

學(xué)生信息類:

package CustomizeException;

public class Student {

    private String name;
    private int age;
    private char sex;

    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public char getSex() {
        return sex;
    }
    //方法
    //使用throws 來聲明異常,就是這個(gè)方法內(nèi)可能存在異常,先事先聲明
    public void setAge(int age) throws Exception {
        if (age < 101 && age > 0) {
            this.age = age;
        } else {            //如果不符合上面的if判斷
            throw new Exception("年齡輸入有誤!");   //這里就要用thrwo 來拋出異常,
        }
    }

    public void setSex(char sex) throws Exception {
        if (sex == '男' || sex == '女') {
            this.sex = sex;
        } else {
            throw new AgeException("這是自定義異常,性別輸入有誤");
        }
    }
}

測試類:

package ExceptionText;
public class TestMain {
    public static void main(String[] args) {

        Student stu = new Student();
        stu.setName("小紅");
        try {
            stu.setAge(18);
            stu.setSex('女');
            System.out.println("我叫:"+stu.getName()+"年齡:"+stu.getAge()+"我的性別是:"+stu.getSex());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

這個(gè)部分的代碼和上面第三部分的一致,可以參考上面的示例。

五、常見的異常

Java異常處理機(jī)制實(shí)例分析

到此,關(guān)于“Java異常處理機(jī)制實(shí)例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI