欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的異常處理(try,catch,finally,throw,throws)

 更新時間:2022年06月14日 09:07:49   作者:? 共飲一杯無?  ?  
本文主要介紹了Java中的異常處理,文章主要介紹的異常處理包括5個關鍵字try,catch,finally,throw,throws,更多詳細內(nèi)容需要的朋友可以參考一下

前言:

Java異常處理的五個關鍵字:try、catch、finally、throw、throws

拋出異常throw

在編寫程序時,我們必須要考慮程序出現(xiàn)問題的情況。比如,在定義方法時,方法需要接受參數(shù)。那么,當調(diào)用方法使用接受到的參數(shù)時,首先需要先對參數(shù)數(shù)據(jù)進行合法的判斷,數(shù)據(jù)若不合法,就應該告訴調(diào)用者,傳遞合法的數(shù)據(jù)進來。這時需要使用拋出異常的方式來告訴調(diào)用者。 在java中,提供了一個throw關鍵字,它用來拋出一個指定的異常對象。那么,拋出一個異常具體如何操作呢???

  • 創(chuàng)建一個異常對象。封裝一些提示信息(信息可以自己編寫)。
  • 需要將這個異常對象告知給調(diào)用者。怎么告知呢?怎么將這個異常對象傳遞到調(diào)用者處呢?通過關鍵字throw就可以完成。throw 異常對象。

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

使用格式:

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

例如:

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

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

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

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

注意:如果產(chǎn)生了問題,我們就會throw將問題描述類即異常進行拋出,也就是將問題返回給該方法的調(diào)用者。 那么對于調(diào)用者來說,該怎么處理呢?一種是進行捕獲處理,另一種就是繼續(xù)講問題聲明出去,使用throws聲明處理。

Objects非空判斷

還記得我們學習過一個類Objects嗎,曾經(jīng)提到過它由一些靜態(tài)的實用方法組成,這些方法是null-save(空指針安全的)或null-tolerant(容忍空指針的),那么在它的源碼中,對對象為null的值進行了拋出異常操作。

  • public static <T> T requireNonNull(T obj):查看指定引用對象不是null。

查看源碼發(fā)現(xiàn)這里對為null的進行了拋出異常操作:

public static <T> T requireNonNull(T obj) {
    if (obj == null)
      	throw new NullPointerException();
    return obj;
}

聲明異常throws

聲明異常:將問題標識出來,報告給調(diào)用者。如果方法內(nèi)通過throw拋出了編譯時異常,而沒有捕獲處理(稍后講解該方式),那么必須通過throws進行聲明,讓調(diào)用者去處理。 關鍵字throws運用于方法聲明之上,用于表示當前方法不處理異常,而是提醒該方法的調(diào)用者來處理異常(拋出異常). 聲明異常格式:

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

聲明異常的代碼演示:

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

    // 如果定義功能時有問題發(fā)生需要報告給調(diào)用者??梢酝ㄟ^在方法上使用throws關鍵字進行聲明
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個文件 
            // 我假設  如果不是 a.txt 認為 該文件不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
    }
}

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

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這個文件 
            // 我假設  如果不是 a.txt 認為 該文件不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
        if (!path.equals("b.txt")) {
            throw new IOException();
        }
    }
}

捕獲異常try…catch

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

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

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

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

捕獲異常語法如下:

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

**try:**該代碼塊中編寫可能產(chǎn)生異常的代碼。 **catch:**用來進行某種異常的捕獲,實現(xiàn)對捕獲到的異常進行處理。

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

演示如下:

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

如何獲取異常信息: Throwable類中定義了一些查看方法:

  • public String getMessage():獲取異常的描述信息,原因(提示給用戶的時候,就提示錯誤原因。
  • public String toString():獲取異常的類型和異常描述信息(不用)。
  • public void printStackTrace():打印異常的跟蹤棧信息并輸出到控制臺。

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

finally 代碼塊

finally:有一些特定的代碼無論異常是否發(fā)生,都需要執(zhí)行。另外,因為異常會引發(fā)程序跳轉(zhuǎn),導致有些語句執(zhí)行不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執(zhí)行的。 什么時候的代碼必須最終執(zhí)行??? 當我們在try語句塊中打開了一些物理資源(磁盤文件/網(wǎng)絡連接/數(shù)據(jù)庫連接等),我們都得在使用完之后,最終關閉打開的資源。 finally的語法: try...catch....finally:自身需要處理異常,最終還得關閉資源。

注意:finally不能單獨使用。

比如在IO流中,當打開了一個關聯(lián)文件的資源,最后程序不管結(jié)果如何,都需要把這個資源關閉掉。 finally代碼參考如下:

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

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

異常注意事項

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

  • 多個異常分別處理。
  • 多個異常一次捕獲,多次處理。
  • 多個異常一次捕獲一次處理。

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

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

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

  • 運行時異常被拋出可以不處理。即不捕獲也不聲明拋出。
  • 如果finally有return語句,永遠返回finally中的結(jié)果,避免該情況.
  • 如果父類拋出了多個異常,子類重寫父類方法時,拋出和父類相同的異?;蛘呤歉割惍惓5淖宇惢蛘卟粧伋霎惓!?/li>
  • 父類方法沒有拋出異常,子類重寫父類該方法時也不可拋出異常。此時子類產(chǎn)生該異常,只能捕獲處理,不能聲明拋出。

到此這篇關于Java中的異常處理(try,catch,finally,throw,throws)的文章就介紹到這了,更多相關Java異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式

    String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式

    這篇文章主要介紹了String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 如何基于Spring使用工廠模式實現(xiàn)程序解耦

    如何基于Spring使用工廠模式實現(xiàn)程序解耦

    這篇文章主要介紹了如何基于Spring使用工廠模式實現(xiàn)程序解耦,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Java中的CyclicBarrier同步屏障詳解

    Java中的CyclicBarrier同步屏障詳解

    這篇文章主要介紹了Java中的CyclicBarrier同步屏障詳解,CyclicBarrier也叫同步屏障,在JDK1.5被引入,可以讓一組線程達到一個屏障時被阻塞,直到最后一個線程達到屏障時,屏障才會開門,所有被阻塞的線程才會繼續(xù)執(zhí)行,需要的朋友可以參考下
    2023-09-09
  • 在Action中以Struts2的方式輸出JSON數(shù)據(jù)的實例

    在Action中以Struts2的方式輸出JSON數(shù)據(jù)的實例

    下面小編就為大家?guī)硪黄贏ction中以Struts2的方式輸出JSON數(shù)據(jù)的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • java 中 阻塞隊列BlockingQueue詳解及實例

    java 中 阻塞隊列BlockingQueue詳解及實例

    這篇文章主要介紹了java 中 阻塞隊列BlockingQueue詳解及實例的相關資料,需要的朋友可以參考下
    2017-03-03
  • 使用BigDecimal除法后保留兩位小數(shù)

    使用BigDecimal除法后保留兩位小數(shù)

    這篇文章主要介紹了使用BigDecimal除法后保留兩位小數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java生成二維碼的實例代碼

    Java生成二維碼的實例代碼

    這篇文章主要介紹了Java生成二維碼的實例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • Spring中ContextLoaderListener監(jiān)聽詳解

    Spring中ContextLoaderListener監(jiān)聽詳解

    這篇文章主要介紹了Spring中ContextLoaderListener監(jiān)聽詳解,SpringMVC啟動時會啟動WebApplicationContext類型的容器,并且會調(diào)用之前分析的refresh方法,需要的朋友可以參考下
    2024-01-01
  • java實現(xiàn)的密碼強度檢測功能完整示例

    java實現(xiàn)的密碼強度檢測功能完整示例

    這篇文章主要介紹了java實現(xiàn)的密碼強度檢測功能,結(jié)合完整實例形式分析了java針對密碼強度檢測相關的字符串遍歷、判斷,以及輸出密碼強度等級相關操作技巧,需要的朋友可以參考下
    2019-06-06
  • Spring Boot Actuator未授權(quán)訪問漏洞的問題解決

    Spring Boot Actuator未授權(quán)訪問漏洞的問題解決

    Spring Boot Actuator 端點的未授權(quán)訪問漏洞是一個安全性問題,可能會導致未經(jīng)授權(quán)的用戶訪問敏感的應用程序信息,本文就來介紹一下解決方法,感興趣的可以了解一下
    2023-09-09

最新評論