Java異常機(jī)制的詳細(xì)介紹-創(chuàng)新互聯(lián)

本篇內(nèi)容主要講解“Java異常機(jī)制的詳細(xì)介紹”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Java異常機(jī)制的詳細(xì)介紹”吧!

成都創(chuàng)新互聯(lián)專注于監(jiān)利企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),成都商城網(wǎng)站開(kāi)發(fā)。監(jiān)利網(wǎng)站建設(shè)公司,為監(jiān)利等地區(qū)提供建站服務(wù)。全流程定制開(kāi)發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

1.異常的概述

1.1什么是異常?

異常:程序在運(yùn)行過(guò)程中發(fā)生由于外部問(wèn)題導(dǎo)致的程序異常事件,發(fā)生的異常會(huì)中斷程序的運(yùn)行。(在Java等面向?qū)ο蟮木幊陶Z(yǔ)言中)異常本身是一個(gè)對(duì)象,產(chǎn)生異常就是產(chǎn)生了一個(gè)異常對(duì)象。注意在java中異常不是錯(cuò)誤,在下文的異常的分類中有解釋。

舉個(gè)生活中的栗子來(lái)說(shuō)明異常吧,假如你平時(shí)是開(kāi)車上班,一般情況下你都能按時(shí)到公司上班,但是今天遇到特殊情況,就是遇到公路施工了,遇到這種情況,如果你沒(méi)有做任何處理,就有可能導(dǎo)致上班遲到。這種“路上施工” 就是程序中的異常了,他是外部問(wèn)題導(dǎo)致的事件,并不是你本身出現(xiàn)的問(wèn)題。(題外話:然而老板并不在意你是什么問(wèn)題導(dǎo)致遲到的,反正你就是遲到了。。。。)

1.2 如何處理異常?

1.2.1 傳統(tǒng)的異常處理

假如現(xiàn)在要求在控制臺(tái)中,輸入被除數(shù)和除數(shù),求商。

傳統(tǒng)做法是這樣的:

public static void main(String[] args) {
        System.out.println("請(qǐng)輸入一個(gè)被除數(shù):");
        Scanner sc = new Scanner(System.in);
        if(sc.hasNextInt()) {            
            int num1 = sc.nextInt();
            System.out.println("請(qǐng)輸入一個(gè)除數(shù):");
            if(sc.hasNextInt()) {                
                int num2 = sc.nextInt();
                if(0 == num2) {
                    System.out.println("除數(shù)不能為0!");
                }else {
                    int r = num1 / num2;
                    System.out.println("r = " + r);
                }
            }else {
                System.out.println("除數(shù)輸入不合法!");
            }
        }else {
            //在控制臺(tái)有可能輸入字符串
            System.out.println("被除數(shù)輸入不合法!");
        }
    }

從上面這個(gè)例子可以可以看出,這么簡(jiǎn)單的業(yè)務(wù)需求,代碼也要寫(xiě)得那么長(zhǎng),因?yàn)橐紤]的問(wèn)題有很多,這樣寫(xiě)代碼會(huì)覺(jué)得很累,而且出現(xiàn)了異常,程序會(huì)中斷,不會(huì)執(zhí)行后面的代碼。因此,Java編程語(yǔ)言使用異常處理機(jī)制為程序提供異常處理的能力。

1.2.2 java的異常處理

在Java中,異常處理的過(guò)程:
Java異常機(jī)制的詳細(xì)介紹
這種處理過(guò)程就像你上班遇到公路施工,你做出了處理——繞路行走,避開(kāi)施工路段,讓你按時(shí)到達(dá)公司!

2.異常的分類

Java異常機(jī)制的詳細(xì)介紹
在 Java 中,所有的異常都有一個(gè)共同的祖先 Throwable(可拋出)。Throwable 指定代碼中可用異常傳播機(jī)制通過(guò) Java 應(yīng)用程序傳輸?shù)娜魏螁?wèn)題的共性。

Throwable: 有兩個(gè)重要的子類:Exception(異常)和 Error(錯(cuò)誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。

Error(錯(cuò)誤):是程序無(wú)法處理的錯(cuò)誤,表示運(yùn)行應(yīng)用程序中較嚴(yán)重問(wèn)題。大多數(shù)錯(cuò)誤與代碼編寫(xiě)者執(zhí)行的操作無(wú)關(guān),而表示代碼運(yùn)行時(shí) JVM(Java 虛擬機(jī))出現(xiàn)的問(wèn)題。例如,Java虛擬機(jī)運(yùn)行錯(cuò)誤(Virtual MachineError),當(dāng) JVM 不再有繼續(xù)執(zhí)行操作所需的內(nèi)存資源時(shí),將出現(xiàn) OutOfMemoryError。這些異常發(fā)生時(shí),Java虛擬機(jī)(JVM)一般會(huì)選擇線程終止。

這些錯(cuò)誤表示故障發(fā)生于虛擬機(jī)自身、或者發(fā)生在虛擬機(jī)試圖執(zhí)行應(yīng)用時(shí),如Java虛擬機(jī)運(yùn)行錯(cuò)誤(Virtual MachineError)、類定義錯(cuò)誤(NoClassDefFoundError)等。這些錯(cuò)誤是不可查的,因?yàn)樗鼈冊(cè)趹?yīng)用程序的控制和處理能力之 外,而且絕大多數(shù)是程序運(yùn)行時(shí)不允許出現(xiàn)的狀況。對(duì)于設(shè)計(jì)合理的應(yīng)用程序來(lái)說(shuō),即使確實(shí)發(fā)生了錯(cuò)誤,本質(zhì)上也不應(yīng)該試圖去處理它所引起的異常狀況。在 Java中,錯(cuò)誤通過(guò)Error的子類描述。

Exception(異常):是程序本身可以處理的異常。Exception 類有一個(gè)重要的子類 RuntimeException。RuntimeException 類及其子類表示“JVM 常用操作”引發(fā)的錯(cuò)誤。例如,若試圖使用空值對(duì)象引用、除數(shù)為零或數(shù)組越界,則分別引發(fā)運(yùn)行時(shí)異常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。注意:異常和錯(cuò)誤的區(qū)別:異常能被程序本身可以處理,錯(cuò)誤是無(wú)法處理。通常,Java的異常(包括Exception和Error)分為可查的異常(checked exceptions)和不可查的異常(unchecked exceptions)。

可查異常(編譯器要求必須處置的異常):正確的程序在運(yùn)行中,很容易出現(xiàn)的、情理可容的異常狀況??刹楫惓km然是異常狀況,但在一定程度上它的發(fā)生是可以預(yù)計(jì)的,而且一旦發(fā)生這種異常狀況,就必須采取某種方式進(jìn)行處理。

除了RuntimeException及其子類以外,其他的Exception類及其子類都屬于可查異常。這種異常的特點(diǎn)是Java編譯器會(huì)檢查它,也就是說(shuō),當(dāng)程序中可能出現(xiàn)這類異常,要么用try-catch語(yǔ)句捕獲它,要么用throws子句聲明拋出它,否則編譯不會(huì)通過(guò)。

不可查異常(編譯器不要求強(qiáng)制處置的異常):包括運(yùn)行時(shí)異常(RuntimeException與其子類)和錯(cuò)誤(Error)。

Exception 這種異常分兩大類運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常(編譯異常)。程序中應(yīng)當(dāng)盡可能去處理這些異常。

運(yùn)行時(shí)異常:都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標(biāo)越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯(cuò)誤引起的,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。運(yùn)行時(shí)異常的特點(diǎn)是Java編譯器不會(huì)檢查它,也就是說(shuō),當(dāng)程序中可能出現(xiàn)這類異常,即使沒(méi)有用try-catch語(yǔ)句捕獲它,也沒(méi)有用throws子句聲明拋出它,也會(huì)編譯通過(guò)。

非運(yùn)行時(shí)異常 (編譯異常):是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語(yǔ)法角度講是必須進(jìn)行處理的異常,如果不處理,程序就不能編譯通過(guò)。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

3.異常處理機(jī)制

通過(guò)上面對(duì)異常的解釋,現(xiàn)在應(yīng)該對(duì)異常有一定的了解。下面來(lái)說(shuō)明在java中是如何處理異常的。
?在java中用對(duì)象來(lái)表示異常的。
?java是通過(guò)try-catch、try-catch-finally、try-catch-catch...語(yǔ)句來(lái)處理異常的。

3.1 try-catch

3.1.1 try-catch的使用

try{} 代碼塊用于執(zhí)行可能存在異常的代碼,catch(異常類型  異常對(duì)象的名稱){}代碼塊用于捕獲并處理異常。
try{
    //有可能出現(xiàn)異常的代碼段1
    //有可能出現(xiàn)異常的代碼段2
}catch(異常類型 e){
    //處理異常的代碼段3
}
//代碼段4

處理1.2.1的兩數(shù)相除問(wèn)題的demo:

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        try{
            System.out.println("請(qǐng)輸入一個(gè)被除數(shù):");
            int num1=sc.nextInt();
            System.out.println("請(qǐng)輸入一個(gè)除數(shù):");
            int num2=sc.nextInt();
            int result=num1/num2;
        }catch(Exception e){
            System.out.println("在此處處理異常!");
        }
        System.out.println("程序運(yùn)行結(jié)束");
}

3.1.2 try-catch的執(zhí)行順序

第一種:沒(méi)有遇到異常,即正常執(zhí)行
Java異常機(jī)制的詳細(xì)介紹
第二種:匹配到異常
Java異常機(jī)制的詳細(xì)介紹
在try{}中的代碼遇到異常時(shí),會(huì)與catch()中括號(hào)里的異常進(jìn)行比對(duì),如果遇到的異常時(shí)屬于catch的異常就會(huì)執(zhí)行catch塊中的代碼,讓后執(zhí)行try-catch塊后面的代碼

第三種:匹配不到異常
Java異常機(jī)制的詳細(xì)介紹

3.2try-catch-finally

try{} 代碼塊用于執(zhí)行可能存在異常的代碼,catch{}代碼塊用于捕獲并處理異常。

finally{} 代碼塊用于回收資源(關(guān)閉文件、關(guān)閉數(shù)據(jù)庫(kù)、關(guān)閉管道)的代碼。finally代碼塊不管是否出現(xiàn)異常,都必須???行( finally塊唯一不執(zhí)行的情況System.exit(0) jvm正常退出。)

3.1.1 try-catch-finally的執(zhí)行順序

第一種:catch塊沒(méi)有return語(yǔ)句

(1)沒(méi)有遇到異常:

try塊內(nèi)的代碼——>finally塊內(nèi)的代碼——>finally塊后的代碼

(2)遇到異常并匹配到異常:

try塊內(nèi)的代碼——>catch塊內(nèi)的代碼——>finally塊內(nèi)的代碼——>finally塊后的代碼

public class Test01 {
    public static void main(String[] args) {
        try {
            int a=1/0;
            System.out.println("try");
        } catch (Exception e) {
            System.out.println("catch");
        }finally {
            System.out.println("finally");
        }
        System.out.println("程序正常運(yùn)行結(jié)束");
    }
}

結(jié)果:

1 catch
2 finally
3 程序正常運(yùn)行結(jié)束

(3)遇到異常卻沒(méi)有匹配到異常:

try塊內(nèi)的代碼——>finally塊內(nèi)的代碼——>程序中斷運(yùn)行

public static void main(String[] args) {
    try {
        int a=1/0;//會(huì)拋出ArithmeticException
        System.out.println("try");
    } catch (NullPointerException e) {
        System.out.println("catch");
    }finally {
        System.out.println("finally");
    }
    System.out.println("程序正常運(yùn)行結(jié)束");
}

結(jié)果:

1 Exception in thread "main" finally
2 java.lang.ArithmeticException: / by zero
3     at Test1.Test01.main(Test01.java:8)

第二種:catch塊有return語(yǔ)句

(1)沒(méi)有異常

try塊內(nèi)的代碼——>finally塊內(nèi)的代碼——>try塊內(nèi)的return語(yǔ)句

public class Test01 {
    public static int test() {
        try {
            int a=2*2;
            System.out.println("try");
            return a;
        } catch (Exception e) {
            System.out.println("catch");
            return 0;
        }finally {
            System.out.println("finally");
        }
    }
    public static void main(String[] args) {
        System.out.println(test());
        System.out.println("程序正常運(yùn)行結(jié)束");
    }
}

結(jié)果:

1 try
2 finally
3 4
4 程序正常運(yùn)行結(jié)束

(2)遇到異常并匹配到異常:

執(zhí)行順序如圖:
Java異常機(jī)制的詳細(xì)介紹

public class Test01 {
    public static int test() {
        try {
            int a=2/0;
            System.out.println("try");
            return a;
        } catch (Exception e) {
            System.out.println("catch");
            return 0;
        }finally {
            System.out.println("finally");
        }
    }
    public static void main(String[] args) {
        System.out.println(test());
        System.out.println("程序正常運(yùn)行結(jié)束");
    }
}

結(jié)果:

1 catch
2 finally
3 0
4 程序正常運(yùn)行結(jié)束

(3)遇到異常卻沒(méi)有匹配到異常:

try塊內(nèi)的代碼——>finally塊內(nèi)的代碼——>程序中斷運(yùn)行

public class Test01 {
    public static int test() {
        try {
            int a=2/0;
            System.out.println("try");
            return a;
        } catch (NullPointerException e) {
            System.out.println("catch");
            return 0;
        }finally {
            System.out.println("finally");
        }
    }
    public static void main(String[] args) {
        System.out.println(test());
        System.out.println("程序正常運(yùn)行結(jié)束");
    }
}

結(jié)果:

finally
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Test1.Test01.test(Test01.java:8)
    at Test1.Test01.main(Test01.java:19)

4. 聲明異常

4.1 throws

當(dāng)開(kāi)發(fā)者在定義方法時(shí),事先知道方法在調(diào)用時(shí)會(huì)出現(xiàn)異常,但不知道該如何處理,此時(shí)可以在該方法上聲明異常。表示該方法在調(diào)用過(guò)程中會(huì)出現(xiàn)異常,請(qǐng)調(diào)用者自行處理。

在java中使用throws 聲明異常。一個(gè)方法可以聲明多個(gè)異常,用,號(hào)分割,寫(xiě)法如下:

1 public void test2()throws IOException,RuntimeException{
2         //有異常出得代碼,在此處沒(méi)有處理
3     }

4.2 聲明異常與方法重載的關(guān)系

聲明異常和方法重載沒(méi)有任何關(guān)系。

4.3 聲明異常與方法重寫(xiě)的關(guān)系

?如果父類方法聲明了異常(檢查時(shí)或運(yùn)行時(shí)),子類方法可以完全遵循父類異常,也可以不聲明異常。
?如果父類方法沒(méi)有聲明異常,子類可以不聲明異常,也可以聲明RuntimeException,但不能聲明Exception。
?如果父類聲明了運(yùn)行時(shí)異常,子類可以完全遵循父類異常,也可以不聲明異常。

5.拋出異常

當(dāng)系統(tǒng)異常滿足不了開(kāi)發(fā)需要時(shí),開(kāi)發(fā)者可以自行根據(jù)需要自行拋出異常。

throw 用于手動(dòng)拋出異常。
Java異常機(jī)制的詳細(xì)介紹
如果一直都沒(méi)有處理(即沒(méi)有用try-catch等語(yǔ)句)異常會(huì)把異常拋給調(diào)用者,一直拋到main函數(shù)處,如果在main函數(shù)中也沒(méi)有處理繼續(xù)在main函數(shù)后拋出異常,這時(shí)候會(huì)拋給jvm處理。如下栗子:

public class Test01 {
    public static void test1()throws IOException,RuntimeException{
        //有異常拋出得代碼,在此處沒(méi)有處理,例如:throw new Exception(“異常信息”);
    }
    public static void test2()throws IOException,RuntimeException{
        test1();//調(diào)用有拋出異常的方法,在此沒(méi)有處理
    }
    public static void main(String[] args)throws IOException,RuntimeException {
        test2();//main調(diào)用有拋出異常的方法,在此沒(méi)有處理
    }
}

注意:

開(kāi)發(fā)者根據(jù)自身需要可以選擇拋出檢查時(shí)異常和運(yùn)行時(shí)異常

6. 自定義異常

當(dāng)JDK 中的異常類型不能滿足程序的需要時(shí),可以自定義異常類。

自定義異常步驟:
?[1] 確定異常類型.繼承Excepion 或者RuntimeException
?[2] 編寫(xiě)自定義異常類,并實(shí)現(xiàn)構(gòu)造方法
?[3] 在方法需要的地方手動(dòng)聲明并拋出異常。

public class myException extends Exception {
    public myException() {
        super();
    }
    public myException(String message) {
        super(message);
    }
    
    //自定義異常中的方法,以符合自己的需求
    public void showInfo() {
        System.out.println(super.getMessage()+"@Line:");
    }
}

到此,相信大家對(duì)“Java異常機(jī)制的詳細(xì)介紹”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

分享標(biāo)題:Java異常機(jī)制的詳細(xì)介紹-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://muchs.cn/article14/dheode.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃面包屑導(dǎo)航、網(wǎng)站維護(hù)、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司