国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

從零開始學(xué)習(xí) Java:簡單易懂的入門指南之異常(二十八)

這篇具有很好參考價(jià)值的文章主要介紹了從零開始學(xué)習(xí) Java:簡單易懂的入門指南之異常(二十八)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 異常

1.1 異常概念

異常,就是不正常的意思。在生活中:醫(yī)生說,你的身體某個(gè)部位有異常,該部位和正常相比有點(diǎn)不同,該部位的功能將受影響.在程序中的意思就是:

  • 異常 :指的是程序在執(zhí)行過程中,出現(xiàn)的非正常的情況,最終會(huì)導(dǎo)致JVM的非正常停止。

在Java等面向?qū)ο蟮木幊陶Z言中,異常本身是一個(gè)類,產(chǎn)生異常就是創(chuàng)建異常對(duì)象并拋出了一個(gè)異常對(duì)象。Java處理異常的方式是中斷處理。

異常指的并不是語法錯(cuò)誤,語法錯(cuò)了,編譯不通過,不會(huì)產(chǎn)生字節(jié)碼文件,根本不能運(yùn)行.

1.2 異常體系

異常機(jī)制其實(shí)是幫助我們找到程序中的問題,異常的根類是java.lang.Throwable,其下有兩個(gè)子類:java.lang.Errorjava.lang.Exception,平常所說的異常指java.lang.Exception。
從零開始學(xué)習(xí) Java:簡單易懂的入門指南之異常(二十八),java基礎(chǔ),學(xué)習(xí),java,python,spring boot,開發(fā)語言

Throwable體系:

  • Error:嚴(yán)重錯(cuò)誤Error,無法通過處理的錯(cuò)誤,只能事先避免,好比絕癥。
  • Exception:表示異常,異常產(chǎn)生后程序員可以通過代碼的方式糾正,使程序繼續(xù)運(yùn)行,是必須要處理的。好比感冒、闌尾炎。

Throwable中的常用方法:

  • public void printStackTrace():打印異常的詳細(xì)信息。

    包含了異常的類型,異常的原因,還包括異常出現(xiàn)的位置,在開發(fā)和調(diào)試階段,都得使用printStackTrace。

  • public String getMessage():獲取發(fā)生異常的原因。

    提示給用戶的時(shí)候,就提示錯(cuò)誤原因。

  • public String toString():獲取異常的類型和異常描述信息(不用)。

出現(xiàn)異常,不要緊張,把異常的簡單類名,拷貝到API中去查。

從零開始學(xué)習(xí) Java:簡單易懂的入門指南之異常(二十八),java基礎(chǔ),學(xué)習(xí),java,python,spring boot,開發(fā)語言

1.3 異常分類

我們平常說的異常就是指Exception,因?yàn)檫@類異常一旦出現(xiàn),我們就要對(duì)代碼進(jìn)行更正,修復(fù)程序。

異常(Exception)的分類:根據(jù)在編譯時(shí)期還是運(yùn)行時(shí)期去檢查異常?

  • 編譯時(shí)期異常:checked異常。在編譯時(shí)期,就會(huì)檢查,如果沒有處理異常,則編譯失敗。(如日期格式化異常)
  • 運(yùn)行時(shí)期異常:runtime異常。在運(yùn)行時(shí)期,檢查異常.在編譯時(shí)期,運(yùn)行異常不會(huì)編譯器檢測(cè)(不報(bào)錯(cuò))。(如數(shù)學(xué)異常)
    從零開始學(xué)習(xí) Java:簡單易懂的入門指南之異常(二十八),java基礎(chǔ),學(xué)習(xí),java,python,spring boot,開發(fā)語言

1.4 異常的產(chǎn)生過程解析

先運(yùn)行下面的程序,程序會(huì)產(chǎn)生一個(gè)數(shù)組索引越界異常ArrayIndexOfBoundsException。我們通過圖解來解析下異常產(chǎn)生的過程。

工具類

public class ArrayTools {
    // 對(duì)給定的數(shù)組通過給定的角標(biāo)獲取元素。
    public static int getElement(int[] arr, int index) {
        int element = arr[index];
        return element;
    }
}

測(cè)試類

public class ExceptionDemo {
    public static void main(String[] args) {
        int[] arr = { 34, 12, 67 };
        intnum = ArrayTools.getElement(arr, 4)
        System.out.println("num=" + num);
        System.out.println("over");
    }
}

上述程序執(zhí)行過程圖解:

從零開始學(xué)習(xí) Java:簡單易懂的入門指南之異常(二十八),java基礎(chǔ),學(xué)習(xí),java,python,spring boot,開發(fā)語言

1.5 拋出異常throw

在編寫程序時(shí),我們必須要考慮程序出現(xiàn)問題的情況。比如,在定義方法時(shí),方法需要接受參數(shù)。那么,當(dāng)調(diào)用方法使用接受到的參數(shù)時(shí),首先需要先對(duì)參數(shù)數(shù)據(jù)進(jìn)行合法的判斷,數(shù)據(jù)若不合法,就應(yīng)該告訴調(diào)用者,傳遞合法的數(shù)據(jù)進(jìn)來。這時(shí)需要使用拋出異常的方式來告訴調(diào)用者。

在java中,提供了一個(gè)throw關(guān)鍵字,它用來拋出一個(gè)指定的異常對(duì)象。那么,拋出一個(gè)異常具體如何操作呢?

  1. 創(chuàng)建一個(gè)異常對(duì)象。封裝一些提示信息(信息可以自己編寫)。

  2. 需要將這個(gè)異常對(duì)象告知給調(diào)用者。怎么告知呢?怎么將這個(gè)異常對(duì)象傳遞到調(diào)用者處呢?通過關(guān)鍵字throw就可以完成。throw 異常對(duì)象。

    throw用在方法內(nèi),用來拋出一個(gè)異常對(duì)象,將這個(gè)異常對(duì)象傳遞到調(diào)用者處,并結(jié)束當(dāng)前方法的執(zhí)行。

使用格式:

throw new 異常類名(參數(shù));

例如:

throw new NullPointerException("要訪問的arr數(shù)組不存在");

throw new ArrayIndexOutOfBoundsException("該索引在數(shù)組中不存在,已超出范圍");

學(xué)習(xí)完拋出異常的格式后,我們通過下面程序演示下throw的使用。

public class ThrowDemo {
    public static void main(String[] args) {
        //創(chuàng)建一個(gè)數(shù)組 
        int[] arr = {2,4,52,2};
        //根據(jù)索引找對(duì)應(yīng)的元素 
        int index = 4;
        int element = getElement(arr, index);

        System.out.println(element);
        System.out.println("over");
    }
    /*
     * 根據(jù) 索引找到數(shù)組中對(duì)應(yīng)的元素
     */
    public static int getElement(int[] arr,int index){ 
       	//判斷  索引是否越界
        if(index<0 || index>arr.length-1){
             /*
             判斷條件如果滿足,當(dāng)執(zhí)行完throw拋出異常對(duì)象后,方法已經(jīng)無法繼續(xù)運(yùn)算。
             這時(shí)就會(huì)結(jié)束當(dāng)前方法的執(zhí)行,并將異常告知給調(diào)用者。這時(shí)就需要通過異常來解決。 
              */
             throw new ArrayIndexOutOfBoundsException("哥們,角標(biāo)越界了```");
        }
        int element = arr[index];
        return element;
    }
}

注意:如果產(chǎn)生了問題,我們就會(huì)throw將問題描述類即異常進(jìn)行拋出,也就是將問題返回給該方法的調(diào)用者。

那么對(duì)于調(diào)用者來說,該怎么處理呢?一種是進(jìn)行捕獲處理,另一種就是繼續(xù)講問題聲明出去,使用throws聲明處理。

1.6 聲明異常throws

聲明異常:將問題標(biāo)識(shí)出來,報(bào)告給調(diào)用者。如果方法內(nèi)通過throw拋出了編譯時(shí)異常,而沒有捕獲處理(稍后講解該方式),那么必須通過throws進(jìn)行聲明,讓調(diào)用者去處理。

關(guān)鍵字throws運(yùn)用于方法聲明之上,用于表示當(dāng)前方法不處理異常,而是提醒該方法的調(diào)用者來處理異常(拋出異常).

聲明異常格式:

修飾符 返回值類型 方法名(參數(shù)) throws 異常類名1,異常類名2…{   }	

聲明異常的代碼演示:

public class ThrowsDemo {
    public static void main(String[] args) throws FileNotFoundException {
        read("a.txt");
    }

    // 如果定義功能時(shí)有問題發(fā)生需要報(bào)告給調(diào)用者。可以通過在方法上使用throws關(guān)鍵字進(jìn)行聲明
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個(gè)文件 
            // 我假設(shè)  如果不是 a.txt 認(rèn)為 該文件不存在 是一個(gè)錯(cuò)誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
    }
}

throws用于進(jìn)行異常類的聲明,若該方法可能有多種異常情況產(chǎn)生,那么在throws后面可以寫多個(gè)異常類,用逗號(hào)隔開。

public class ThrowsDemo2 {
    public static void main(String[] args) throws IOException {
        read("a.txt");
    }

    public static void read(String path)throws FileNotFoundException, IOException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個(gè)文件 
            // 我假設(shè)  如果不是 a.txt 認(rèn)為 該文件不存在 是一個(gè)錯(cuò)誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
        if (!path.equals("b.txt")) {
            throw new IOException();
        }
    }
}

1.7 捕獲異常try…catch

如果異常出現(xiàn)的話,會(huì)立刻終止程序,所以我們得處理異常:

  1. 該方法不處理,而是聲明拋出,由該方法的調(diào)用者來處理(throws)。
  2. 在方法中使用try-catch的語句塊來處理異常。

try-catch的方式就是捕獲異常。

  • 捕獲異常:Java中對(duì)異常有針對(duì)性的語句進(jìn)行捕獲,可以對(duì)出現(xiàn)的異常進(jìn)行指定方式的處理。

捕獲異常語法如下:

try{
     編寫可能會(huì)出現(xiàn)異常的代碼
}catch(異常類型  e){
     處理異常的代碼
     //記錄日志/打印異常信息/繼續(xù)拋出異常
}

try:該代碼塊中編寫可能產(chǎn)生異常的代碼。

catch:用來進(jìn)行某種異常的捕獲,實(shí)現(xiàn)對(duì)捕獲到的異常進(jìn)行處理。

注意:try和catch都不能單獨(dú)使用,必須連用。

演示如下:

public class TryCatchDemo {
    public static void main(String[] args) {
        try {// 當(dāng)產(chǎn)生異常時(shí),必須有處理方式。要么捕獲,要么聲明。
            read("b.txt");
        } catch (FileNotFoundException e) {// 括號(hào)中需要定義什么呢?
          	//try中拋出的是什么異常,在括號(hào)中就定義什么異常類型
            System.out.println(e);
        }
        System.out.println("over");
    }
    /*
     *
     * 我們 當(dāng)前的這個(gè)方法中 有異常  有編譯期異常
     */
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個(gè)文件 
            // 我假設(shè)  如果不是 a.txt 認(rèn)為 該文件不存在 是一個(gè)錯(cuò)誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
    }
}

如何獲取異常信息:

Throwable類中定義了一些查看方法:

  • public String getMessage():獲取異常的描述信息,原因(提示給用戶的時(shí)候,就提示錯(cuò)誤原因。

  • public String toString():獲取異常的類型和異常描述信息(不用)。

  • public void printStackTrace():打印異常的跟蹤棧信息并輸出到控制臺(tái)。

? 包含了異常的類型,異常的原因,還包括異常出現(xiàn)的位置,在開發(fā)和調(diào)試階段,都得使用printStackTrace。

在開發(fā)中呢也可以在catch將編譯期異常轉(zhuǎn)換成運(yùn)行期異常處理。

多個(gè)異常使用捕獲又該如何處理呢?

  1. 多個(gè)異常分別處理。
  2. 多個(gè)異常一次捕獲,多次處理。
  3. 多個(gè)異常一次捕獲一次處理。

一般我們是使用一次捕獲多次處理方式,格式如下:

try{
     編寫可能會(huì)出現(xiàn)異常的代碼
}catch(異常類型A  e){  當(dāng)try中出現(xiàn)A類型異常,就用該catch來捕獲.
     處理異常的代碼
     //記錄日志/打印異常信息/繼續(xù)拋出異常
}catch(異常類型B  e){  當(dāng)try中出現(xiàn)B類型異常,就用該catch來捕獲.
     處理異常的代碼
     //記錄日志/打印異常信息/繼續(xù)拋出異常
}

注意:這種異常處理方式,要求多個(gè)catch中的異常不能相同,并且若catch中的多個(gè)異常之間有子父類異常的關(guān)系,那么子類異常要求在上面的catch處理,父類異常在下面的catch處理。

1.8 finally 代碼塊

finally:有一些特定的代碼無論異常是否發(fā)生,都需要執(zhí)行。另外,因?yàn)楫惓?huì)引發(fā)程序跳轉(zhuǎn),導(dǎo)致有些語句執(zhí)行不到。而finally就是解決這個(gè)問題的,在finally代碼塊中存放的代碼都是一定會(huì)被執(zhí)行的。

什么時(shí)候的代碼必須最終執(zhí)行?

當(dāng)我們?cè)趖ry語句塊中打開了一些物理資源(磁盤文件/網(wǎng)絡(luò)連接/數(shù)據(jù)庫連接等),我們都得在使用完之后,最終關(guān)閉打開的資源。

finally的語法:

try…catch…finally:自身需要處理異常,最終還得關(guān)閉資源。

注意:finally不能單獨(dú)使用。

比如在我們之后學(xué)習(xí)的IO流中,當(dāng)打開了一個(gè)關(guān)聯(lián)文件的資源,最后程序不管結(jié)果如何,都需要把這個(gè)資源關(guān)閉掉。

finally代碼參考如下:

public class TryCatchDemo4 {
    public static void main(String[] args) {
        try {
            read("a.txt");
        } catch (FileNotFoundException e) {
            //抓取到的是編譯期異常  拋出去的是運(yùn)行期 
            throw new RuntimeException(e);
        } finally {
            System.out.println("不管程序怎樣,這里都將會(huì)被執(zhí)行。");
        }
        System.out.println("over");
    }
    /*
     *
     * 我們 當(dāng)前的這個(gè)方法中 有異常  有編譯期異常
     */
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個(gè)文件 
            // 我假設(shè)  如果不是 a.txt 認(rèn)為 該文件不存在 是一個(gè)錯(cuò)誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
    }
}

當(dāng)只有在try或者catch中調(diào)用退出JVM的相關(guān)方法,此時(shí)finally才不會(huì)執(zhí)行,否則finally永遠(yuǎn)會(huì)執(zhí)行。

1.9 異常注意事項(xiàng)

  • 運(yùn)行時(shí)異常被拋出可以不處理。即不捕獲也不聲明拋出。
  • 如果父類拋出了多個(gè)異常,子類覆蓋父類方法時(shí),只能拋出相同的異常或者是他的子集。
  • 父類方法沒有拋出異常,子類覆蓋父類該方法時(shí)也不可拋出異常。此時(shí)子類產(chǎn)生該異常,只能捕獲處理,不能聲明拋出
  • 當(dāng)多異常處理時(shí),捕獲處理,前邊的類不能是后邊類的父類
  • 在try/catch后可以追加finally代碼塊,其中的代碼一定會(huì)被執(zhí)行,通常用于資源回收。

1.10 概述

為什么需要自定義異常類:

我們說了Java中不同的異常類,分別表示著某一種具體的異常情況,那么在開發(fā)中總是有些異常情況是SUN沒有定義好的,此時(shí)我們根據(jù)自己業(yè)務(wù)的異常情況來定義異常類。,例如年齡負(fù)數(shù)問題,考試成績負(fù)數(shù)問題。

在上述代碼中,發(fā)現(xiàn)這些異常都是JDK內(nèi)部定義好的,但是實(shí)際開發(fā)中也會(huì)出現(xiàn)很多異常,這些異常很可能在JDK中沒有定義過,例如年齡負(fù)數(shù)問題,考試成績負(fù)數(shù)問題.那么能不能自己定義異常呢?

什么是自定義異常類:

在開發(fā)中根據(jù)自己業(yè)務(wù)的異常情況來定義異常類.

自定義一個(gè)業(yè)務(wù)邏輯異常: LoginException。一個(gè)登陸異常類。

異常類如何定義:

  1. 自定義一個(gè)編譯期異常: 自定義類 并繼承于java.lang.Exception。
  2. 自定義一個(gè)運(yùn)行時(shí)期的異常類:自定義類 并繼承于java.lang.RuntimeException。

1.11 自定義異常的練習(xí)

要求:我們模擬登陸操作,如果用戶名已存在,則拋出異常并提示:親,該用戶名已經(jīng)被注冊(cè)。

首先定義一個(gè)登陸異常類LoginException:

// 業(yè)務(wù)邏輯異常
public class LoginException extends Exception {
    /**
     * 空參構(gòu)造
     */
    public LoginException() {
    }

    /**
     *
     * @param message 表示異常提示
     */
    public LoginException(String message) {
        super(message);
    }
}

模擬登陸操作,使用數(shù)組模擬數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù),并提供當(dāng)前注冊(cè)賬號(hào)是否存在方法用于判斷。

public class Demo {
    // 模擬數(shù)據(jù)庫中已存在賬號(hào)
    private static String[] names = {"bill","hill","jill"};
   
    public static void main(String[] args) {     
        //調(diào)用方法
        try{
            // 可能出現(xiàn)異常的代碼
            checkUsername("nill");
            System.out.println("注冊(cè)成功");//如果沒有異常就是注冊(cè)成功
        } catch(LoginException e) {
            //處理異常
            e.printStackTrace();
        }
    }

    //判斷當(dāng)前注冊(cè)賬號(hào)是否存在
    //因?yàn)槭蔷幾g期異常,又想調(diào)用者去處理 所以聲明該異常
    public static boolean checkUsername(String uname) throws LoginException {
        for (String name : names) {
            if(name.equals(uname)){//如果名字在這里面 就拋出登陸異常
                throw new LoginException("親"+name+"已經(jīng)被注冊(cè)了!");
            }
        }
        return true;
    }
}

后記
????????美好的一天,到此結(jié)束,下次繼續(xù)努力!欲知后續(xù),請(qǐng)看下回分解,寫作不易,感謝大家的支持?。???????
文章來源地址http://www.zghlxwxcb.cn/news/detail-715757.html

到了這里,關(guān)于從零開始學(xué)習(xí) Java:簡單易懂的入門指南之異常(二十八)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包