亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java學習之異常處理的新特性詳解

 更新時間:2023年08月22日 09:22:52   作者:一一哥Sun  
異常處理機制是Java很早時就搞出來的技術,但在實際應用中,我們發(fā)現(xiàn)這個異常處理也有一些不完善的地方,接下來主要給大家介紹一下Java異常處理的一些新特性,需要的朋友可以參考下

一. 異常處理新特性

異常處理機制是Java很早時就搞出來的技術,但在實際應用中,我們發(fā)現(xiàn)這個異常處理也有一些不完善的地方。比如在操作IO流時經(jīng)常需要關閉IO資源,這些代碼就得放在finally代碼塊中,而在finally中關閉IO流時,又會提示我們需要再次捕獲異常。或者有時我們在一個方法中,同時要捕獲多個異常,這就需要使用多個catch代碼塊。但這樣一來,我們寫出來的代碼就顯得特別啰嗦繁瑣,所以很多Java程序員就很希望能夠簡化這種操作。而Java團隊也很重視大家的反饋,在新的JDK版本中對此進行了相關的優(yōu)化,接下來就給大家說一下關于異常處理的新特性。

1. 多異常捕獲

1.1 存在的問題

我們先來回顧一下在使用try-catch多重結構時存在的問題,比如下面這樣的代碼:

try{
    // 可能會發(fā)生異常的語句
} catch (FileNotFoundException e) {
    // 調(diào)用方法methodA處理
} catch (IOException e) {
    // 調(diào)用方法methodA處理
} catch (ParseException e) {
    // 調(diào)用方法methodA處理
} catch(...){
   ....
}

相信大家對上面這樣的代碼塊已經(jīng)不陌生了,這種多catch的代碼塊雖然客觀上提高了程序的健壯性,但也讓我們的代碼量大大的增加,可讀性降低了很多。其實代碼中雖然有些異常的種類不同,但如果捕獲之后的處理是相同的,那是否可以把多個異常合并在一起處理呢?

1.2 解決辦法

為了解決多catch代碼塊的問題,在JDK 7中,Java開始支持”多異常捕獲“技術,允許我們把多個異常進行合并處理。我們來看看如下案例:

public static void main(String[] args) {
    try {
        int a = Integer.parseInt("100");
        int b = a / 0;
        System.out.println("b=" + b);
    } catch (IndexOutOfBoundsException | NumberFormatException | ArithmeticException e) {
        System.out.println("異常信息="+e.getMessage());
        e.printStackTrace();
        // 捕獲多個異常時,異常對象e的前面默認有final修飾,e對象不能被重新賦值
        // 否則會產(chǎn)生如下異常:The parameter e of a multi-catch block cannot be assigned
        //e = new ArithmeticException("test");
    } catch (Exception e) {
        System.out.println("e,異常信息="+e.getMessage());
        e.printStackTrace();
        // 捕獲一種類型的異常時,異常變量沒有final修飾,e變量可以被重新賦值
        e = new RuntimeException("test");
    }
}

在上面的代碼中,我們在一個catch()中同時捕獲了”IndexOutOfBoundsException | NumberFormatException | ArithmeticException“多個異常對象。但是我們要注意,在捕獲多個異常對象時,異常對象e的前面默認會帶有final修飾,所以e對象就不能再被重新賦值,否則會產(chǎn)生如下異常:The parameter e of a multi-catch block cannot be assigned。而默認的單個異常對象捕獲時,并不會帶有final修飾符。

1.3 小結

根據(jù)上面的案例,再把本節(jié)內(nèi)容給大家總結一下:

  • 捕獲多種類型異常時,多種異常類型之間要用豎線 | 隔開;
  • 捕獲多種類型異常時,異常變量前默認帶有隱式的final修飾,我們不能再對異常變量重新賦值。

2. 自動資源管理

2.1 概述

在Java中,我們經(jīng)常需要管理一些資源,例如文件、數(shù)據(jù)庫連接、網(wǎng)絡連接等。在使用完這些資源后,我們需要關閉它們以釋放系統(tǒng)資源,否則可能會導致系統(tǒng)崩潰或資源泄漏。在以前的代碼實現(xiàn)中,經(jīng)常需要在finally代碼塊中對這些資源進行關閉,最終寫出來的代碼就特別啰嗦。

后來JDK 7給我們增加了一個新特性,該特性可以自動關閉資源文件,被稱為自動資源管理(Automatic Resource Management,簡稱ARM) 。這樣,我們在處理異常時,就可以利用自動資源管理來正確地管理這些資源,避免因為忘記關閉資源而導致一些問題。

2.2 自動資源管理

所謂的自動資源管理,是指我們在使用IO流等物理資源時,程序會自動為我們釋放這些資源,無需再手動調(diào)用關閉資源的方法。自動資源管理主要是通過try-with-resources語句進行實現(xiàn),該語句是從JDK 7版本中開始引入的。但如果我們想使用該功能,需要滿足以下兩個條件:

物理資源對象必須實現(xiàn)AutoCloseable接口或其子接口Closeable,Closeable接口只有一個close()方法,用于關閉資源。

try-with-resources的代碼塊只能使用try語句中聲明的資源對象。

AutoCloseable接口是在Java 7中新增的接口,用于指示資源需要在使用完畢后關閉。Java 7幾乎把所有的“資源類”(包括各種文件IO類、JDBC的Connection 和 Statement等接口)都進行了改寫,改寫后的資源類都實現(xiàn)了AutoCloseable 或 Closeable接口。這樣當try-with-resources語句執(zhí)行完成后,Java就會自動調(diào)用資源對象的close()方法釋放資源。即使try語句塊中發(fā)生了異常,也會自動關閉資源,確保了資源在使用完后被正確的關閉。

2.3 代碼案例

接下來再通過一個代碼案例來演示自動資源管理該如何實現(xiàn)。

public class Demo10 {
    public static void main(String[] args) {
        //try中聲明的資源對象默認會帶有final修飾符,try中可以同時聲明多個資源對象
        try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }//這里就沒有使用finally代碼,Java會自動關閉IO流
    }
}

在上面的例子中,我們就使用了try-with-resources語句來讀取一個文件,try語句中聲明的資源會被隱式聲明為final,且在一條try語句中可以同時聲明或初始化多個資源。BufferedReader和FileReader都實現(xiàn)了AutoCloseable接口,因此在使用完之后,它們會被自動關閉。

而且你會發(fā)現(xiàn),其實try-with-resources的用法和try-catch是一樣的,但不用我們再編寫finally代碼了。這是因為自動關閉資源中的try語句,相當于包含了隱式的finally塊,這個finally塊會自動關閉資源。所以這樣我們就可以簡化代碼,避免代碼中出現(xiàn)大量的 try-catch塊和finally塊,使代碼更加簡潔易讀,而且能夠自動處理多個資源的關閉,避免了繁瑣的手動關閉操作。

2.4 增強的自動資源管理

雖然JDK 7中的自動資源管理已經(jīng)讓我們的代碼很簡化了,但很多人覺得還是不夠,所以在JDK 9中又再次增強了自動資源管理功能。JDK 9允許我們將多個資源變量放在try語句后的圓括號中,但不要求我們在try語句的圓括號中聲明并創(chuàng)建資源,只需要把自動關閉的資源帶有final修飾即可。 接下來再通過一個案例給大家演示一下JDK 9的特性。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
/**
 * @author 一一哥Sun 
 */
public class Demo11 {
    public static void main(String[] args) throws IOException {
        //需要在資源對象前面添加final修飾符
        //讀取一個文件
        final FileReader fileReader = new FileReader("file.txt");
        final BufferedReader br = new BufferedReader(fileReader);
        //JDK 9之后,try()后的括號中可以同時捕獲處理多個資源對象,會對這多個資源對象自動關閉
        try (fileReader;br){
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } 
    }
}

在上面的案例中,我們需要在資源對象前面添加final修飾符,并且try()后的括號中可以同時捕獲處理多個資源對象,多個對象之間用分號";"進行分割,最終Java會對這多個資源對象自動關閉。

2.5 注意事項

我們在使用try-with-resources時需要注意以下幾點:

  • try-with-resources語句塊中的資源必須實現(xiàn) AutoCloseable 或Closeable接口,否則編譯器會報錯;
  • 在try-with-resources語句塊中,當異常拋出時,會按照資源的創(chuàng)建順序依次關閉每個資源;
  • 如果在關閉某個資源時拋出了異常,該異常會被抑制(suppressed),并添加到try塊中拋出的異常中,我們可以通過getSuppressed方法獲取抑制的異常;
  • 除了Java標準庫中自帶的資源對象,我們也可以自定義資源對象,自定義資源對象時需要實現(xiàn)AutoCloseable接口或其子接口Closeable。

二. 結語

至此,就把異常的新特性也給大家講解完畢了.

以上就是Java學習之異常處理的新特性詳解的詳細內(nèi)容,更多關于Java異常處理特性的資料請關注腳本之家其它相關文章!

相關文章

  • 程序包org.springframework不存在的解決辦法

    程序包org.springframework不存在的解決辦法

    這篇文章主要介紹了程序包org.springframework不存在的解決辦法,在使用IDEA創(chuàng)建SpringBoot項目時,剛打開無法正常運行,本文通過圖文結合的方式給大家介紹的非常詳細,具有一定參考價值,需要的朋友可以參考下
    2024-07-07
  • Spring boot JPA實現(xiàn)分頁和枚舉轉換代碼示例

    Spring boot JPA實現(xiàn)分頁和枚舉轉換代碼示例

    這篇文章主要介紹了Spring boot JPA實現(xiàn)分頁和枚舉轉換代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot集成SQL?Server的詳細指南

    SpringBoot集成SQL?Server的詳細指南

    SQL?Server是由Microsoft開發(fā)和推廣的以客戶/服務器(c/s)模式訪問、使用Transact-SQL語言的關系數(shù)據(jù)庫管理系統(tǒng)(DBMS),本文給大家介紹了Spring?Boot集成SQL?Server的詳細指南,需要的朋友可以參考下
    2024-11-11
  • springboot 集成pgsql+mybatis plus的詳細步驟

    springboot 集成pgsql+mybatis plus的詳細步驟

    集成 Spring Boot、PostgreSQL 和 MyBatis Plus 的步驟與 MyBatis 類似,只不過在 MyBatis Plus 中提供了更多的便利功能,如自動生成 SQL、分頁查詢、Wrapper 查詢等,下面分步驟給大家介紹springboot 集成pgsql+mybatis plus的過程,感興趣的朋友一起看看吧
    2023-12-12
  • 一篇文章帶你認識Java8接口的默認方法

    一篇文章帶你認識Java8接口的默認方法

    這篇文章主要給大家介紹了如何通過一篇文章帶你認識Java8接口的默認方法的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java8具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • Spring配置文件的拆分和整合過程分析

    Spring配置文件的拆分和整合過程分析

    在實際應用里,隨著應用規(guī)模的增加,系統(tǒng)中 Bean 數(shù)量也大量增加,導致配置文件非常龐大。為了避免這種情況的產(chǎn)生,提高配置文件的可讀性與可維護性,可以將Spring 配置文件分解成多個配置文件,感興趣的朋友跟隨小編一起看看吧
    2022-10-10
  • 簡單闡述一下Java集合的概要

    簡單闡述一下Java集合的概要

    今天給大家?guī)淼奈恼率顷P于Java的相關知識,文章圍繞著Java集合的概要展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • MyBatis-Flex實現(xiàn)多表聯(lián)查(自動映射)

    MyBatis-Flex實現(xiàn)多表聯(lián)查(自動映射)

    我們可以輕松的使用 Mybaits-Flex 鏈接任何數(shù)據(jù)庫,本文主要介紹了MyBatis-Flex實現(xiàn)多表聯(lián)查(自動映射),具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Springmvc國際化自動配置代碼實現(xiàn)

    Springmvc國際化自動配置代碼實現(xiàn)

    這篇文章主要介紹了Springmvc國際化自動配置代碼實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java 正確終止線程的方法

    Java 正確終止線程的方法

    這篇文章主要介紹了Java 正確終止線程的方法,幫助大家更好的理解和學習java 多線程的相關知識,感興趣的朋友可以了解下
    2020-12-12

最新評論