最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

學習Java之異常到底該如何捕獲和處理

 更新時間:2023年08月10日 08:23:37   作者:一一哥Sun  
我們知道,Java的異常處理是通過5個關鍵字來實現(xiàn)的,即try、catch、throw、throws和finally,try?catch語句用于捕獲并處理異常,但具體該怎么捕獲異常,怎么拋出異常,什么時候拋,什么時候捕,感興趣的小伙伴跟著小編一起來看看吧

一. 捕獲和處理異常

1. 概述

在Java中,如果某行或某幾行代碼有可能會拋出異常,我們此時就可以用try ... catch ... finally進行捕獲處理。把可能發(fā)生異常的語句放在try { ... }語句中,然后使用catch語句捕獲對應的Exception及其子類,把必須執(zhí)行的代碼放在finally語句中。接下來我們就來看看具體的代碼實現(xiàn)吧。

2. try-catch結構

2.1 基本語法

首先我們來看看try-catch的基本語法:

try {
    // 可能發(fā)生異常的語句
} catch(Exception e) {
    // 處理異常語句
}

在上面的語法中,我們要把可能引發(fā)異常的語句封裝在try語句塊中,用于捕獲可能發(fā)生的異常。catch語句里的( )中,要傳入與try語句里匹配的異常類,指明catch語句可以處理的異常類型。

也就是說,如果此時try語句塊中發(fā)生了某個異常,那么這個相應的異常對象就會被拋出,產(chǎn)生異常的這行代碼之后的其余代碼就不會再被執(zhí)行。然后catch語句就開始執(zhí)行,把try中拋出的異常對象進行捕獲并處理。
當然,如果try語句塊中沒有發(fā)生異常,那么try里的代碼就會正常執(zhí)行結束,而后面的catch就會被跳過。

這里我們需要注意:try...catch與if...else是不一樣的,try后面的花括號{ }不可以省略,即便try中只有一行代碼。同樣的,catch的花括號 { } 也不可以省略。另外,try語句塊中聲明的變量屬于局部變量,它只在try中有效,其它地方不能訪問該變量。

2.2 代碼實現(xiàn)

接下來設計一個代碼案例,來講解try-catch的用法:

/**
 * @author
 */
public class Demo01 {
    public static void main(String[] args) {
        //定義一個長度為3的數(shù)組
        int[] array = new int[3];
        try {
            //索引超出了數(shù)組長度,將會引發(fā)ArrayIndexOutOfBoundsException數(shù)組下標越界異常
            array[3] = 1; 
            //發(fā)生異常后,這行代碼并不會執(zhí)行
            System.out.println("數(shù)組:" + array.toString());
        } catch (ArrayIndexOutOfBoundsException e) {
            //指出異常的類型、性質(zhì)、棧層次及出現(xiàn)在程序中的位置
            e.printStackTrace();
            //輸出錯誤的原因及性質(zhì)
            System.out.println("數(shù)組越界:" + e.getMessage());
            //輸出異常的類型與性質(zhì)
            System.out.println("數(shù)組越界:" + e.toString());
        }
    }
}

在上面這段代碼中,小編在try語句中創(chuàng)建了一個長度為3的整數(shù)數(shù)組,并嘗試著將第4個位置上的元素值設為1。由于數(shù)組越界,這會引發(fā)代碼故障,java會拋出一個ArrayIndexOutOfBoundsException異常。由于發(fā)生了異常,所以后面的數(shù)組輸出語句就不會被執(zhí)行。

而我們在catch中接收了ArrayIndexOutOfBoundsException異常,這個異常與try中拋出的異常是一致的,所以代碼會跳轉(zhuǎn)到catch中進行異常的處理。另外在上面的處理代碼塊中,我們可以通過Exception異常對象的以下方法,來獲取到相應的異常信息。

  • printStackTrace()方法:輸出異常棧信息,指出異常的類型、性質(zhì)、棧層次及出現(xiàn)在程序中的位置;
  • getMessage()方法:輸出錯誤的性質(zhì);
  • toString()方法:輸出異常的類型與性質(zhì)。

3. 多重catch結構

我們在編寫java代碼時,多行語句有可能會產(chǎn)生多個不同的異常,你們面對這個多個異常該怎么處理呢?其實我們可以使用多重catch語句來分別處理多個異常。

3.1 基本語法

多重catch語句的基本語法格式如下:

try {
    // 可能會發(fā)生異常的語句
} catch(ExceptionType e) {
    // 處理異常語句
} catch(ExceptionType e) {
    // 處理異常語句
} catch(ExceptionType e) {
    // 處理異常語句
	...
}

當存在多個catch代碼塊時,只要有一個catch代碼塊捕獲到一個異常,其它的catch代碼塊就不再進行匹配。但是我們要注意,當捕獲的多個異常類之間存在父子關系時,一般是先捕獲子類,再捕獲父類。所以我們在編寫代碼時,要把子類異常放在父類異常的前面,否則子類就會捕獲不到。

3.2 代碼實現(xiàn)

接下來給大家設計了一個利用IO流讀取文件內(nèi)容的案例,這段代碼就可能會出現(xiàn)兩個異常。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
 * @author 一一哥Sun
 */
public class Demo02 {
    //多重catch語句
    public static void main(String[] args) {
        //定義一個緩沖流對象,以后在IO流階段壹哥會細講
        BufferedReader reader = null;
        try {
            //對接一個file.txt文件,該文件可能不存在
            reader = new BufferedReader(new FileReader("file.txt"));
            //讀取文件中的內(nèi)容。所有的IO流都可能會產(chǎn)生IO流異常
            String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                line = reader.readLine();
            }
        } catch (FileNotFoundException e) {
        	//處理文件不存在時的異常
            System.out.println("文件不存在:" + e.getMessage());
        } catch (IOException e) {
        	//處理IO異常
            System.out.println("讀取文件失?。? + e.getMessage());
        } 
	}
}

在這段代碼中,我們嘗試打開一個名為file.txt的文件,并逐行讀取其內(nèi)容。如果該文件不存在或讀取失敗,程序?qū)谙鄳腸atch塊中處理異常,并打印出異常消息。具體地來說,就是try代碼塊的第16行代碼調(diào)用了FileReader的構造方法,這里有可能會發(fā)生FileNotFoundException異常。而第18行調(diào)用BufferedReader輸入流的readLine()方法時,有可能會發(fā)生IOException異常。

因為FileNotFoundException異常是IOException異常的子類,所以我們應該先捕獲 FileNotFoundException異常,即第23行代碼;后捕獲IOException異常,即第26行代碼。但是如果我們將FileNotFoundException和IOException異常的捕獲順序進行調(diào)換,那么捕獲FileNotFoundException異常的代碼塊永遠也不會執(zhí)行,所以FileNotFoundException異常也永遠不會被處理。當然,如果多個異常之間沒有父子關系,則其順序就無所謂了。

4. try-catch-finally結構

在上面的代碼中,我們涉及到了IO流的相關內(nèi)容,這一塊我們還沒有開始進行學習,會在以后給大家進行詳細地講解。

IO流屬于一種比較消耗物理資源的API,使用完之后應該把IO流進行關閉,否則就可能會導致物理資源被過多的消耗。那么我們該在哪里關閉IO流呢?有的人會說,我們可以在try語句塊執(zhí)行完正常的功能后關閉IO流。但是大家要知道,try語句塊和catch語句塊有可能因為異常并沒有被完全執(zhí)行,那么try里打開的這些物理資源到底要在哪里回收呢?

為了確保這些物理資源一定可以被回收,異常處理機制給我們提供了finally代碼塊,且Java 7之后又提供了自動資源管理(Automatic Resource Management)技術,更是可以優(yōu)雅地解決資源回收的問題。

4.1 基本語法

無論是否發(fā)生異常,finally里的代碼總會被執(zhí)行。在 finally代碼塊中,我們可以執(zhí)行一些清理等收尾善后性質(zhì)的代碼,其基本語法格式如下:

try {
    // 可能會發(fā)生異常的語句
} catch(ExceptionType e) {
    // 處理異常語句
} finally {
    // 執(zhí)行清理代碼塊,這里的代碼肯定會被執(zhí)行到,除非極特殊的情況發(fā)生
}

上面的代碼中,無論是否發(fā)生了異常(除極特殊的情況外,比如提前調(diào)用了System.exit()退出虛擬機的方法),finally語句塊中的代碼都會被執(zhí)行。另外,finally語句也可以直接和try語句配合使用,其語法格式如下:

try {
    // 邏輯代碼塊
} finally {
    // 清理代碼塊
}

我們在使用try-catch-finally語句時要注意以下幾點:

在異常處理的語法結構中,只有try是必需的。如果沒有try代碼塊,則不能有后面的catch和finally;

雖然catch塊和finally塊是可選的,但也不能只有try塊,catch塊和finally塊至少要出現(xiàn)其中之一,也可以同時出現(xiàn);

可以有多個catch塊,捕獲父類異常的catch塊,必須位于捕獲子類異常的后面;

多個catch塊必須位于try塊之后,finally塊必須位于所有的catch塊之后;

只有finally與try語句塊的語法格式,這種情況會導致異常的丟失,所以并不常見;

通常情況下,我們不應該在finally代碼塊中使用return或throw等會導致方法終止的語句,否則這將會導致try和catch代碼塊中的return和throw語句失效。

尤其是try-catch-finally與return的結合,是我們面試時的一個考點哦。有些面試官會賤賤地問你try-catch-finally中如果有return,會發(fā)生什么,請大家自行做個實驗吧。

4.2 代碼實現(xiàn)

接下來在之前的案例基礎上進行改造,引入finally代碼塊:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
 * @author 
 */
public class Demo03 {
    //try-catch-finally語句
    public static void main(String[] args) {
        //定義一個緩沖流對象,以后在IO流階段壹哥會細講
        BufferedReader reader = null;
        try {
        	//對接一個file.txt文件,該文件可能不存在
            reader = new BufferedReader(new FileReader("file.txt"));
            //讀取文件中的內(nèi)容。所有的IO流都可能會產(chǎn)生IO流異常
            String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                line = reader.readLine();
            }
        } catch (FileNotFoundException e) {
        	//處理文件不存在時的異常
            System.out.println("文件不存在:" + e.getMessage());
        } catch (IOException e) {
            //處理IO異常
            System.out.println("讀取文件失?。? + e.getMessage());
        } finally {
            try {
                //在finally代碼塊中也可以進行try-catch的操作
                if (reader != null) {
                	//關閉IO流
                    reader.close();
                }
            } catch (IOException e) {
                System.out.println("關閉文件失?。? + e.getMessage());
            }
        }
	}
}

在這段代碼中,我們嘗試打開一個名為file.txt的文件,并逐行讀取其內(nèi)容。如果文件不存在或讀取失敗,程序?qū)⒃谙鄳腸atch塊中處理異常,并打印出異常消息。無論是否發(fā)生異常,程序都會在finally塊中關閉文件。

4.3 小結

在try-catch-finally組合的結構中,其執(zhí)行流程如下圖所示:

根據(jù)該流程可知,try-catch-finally語句塊的執(zhí)行情況可以細分為以下幾種情況:

如果try代碼塊中沒有拋出異常,則執(zhí)行完try代碼塊后會直接執(zhí)行finally代碼塊;

如果try代碼塊中拋出了異常,并被catch子句捕捉,則終止try代碼塊的執(zhí)行,轉(zhuǎn)而執(zhí)行相匹配的 catch代碼塊,之后再執(zhí)行 finally代碼塊;

如果try代碼塊中拋出的異常沒有被任何catch子句捕獲到,將會直接執(zhí)行finally代碼塊中的語句,并把該異常傳遞給該方法的調(diào)用者;

如果在finally代碼塊中也拋出了異常,則會把該異常傳遞給該方法的調(diào)用者。

二. 結語

至此,就把今天的內(nèi)容講解完畢了,通過今天的內(nèi)容,大家要注意以下幾點:

  • try...catch與if...else是不一樣的,try后面的花括號{ }不可以省略,即便try中只有一行代碼;
  • 同樣的,catch的花括號 { } 也不可以省略;
  • 當捕獲的多個異常類之間存在父子關系時,一般是先捕獲子類,再捕獲父類;
  • 在異常處理的語法結構中,只有try是必需的。如果沒有try代碼塊,則不能有后面的catch和finally。

以上就是學習Java之異常到底該如何捕獲和處理的詳細內(nèi)容,更多關于Java異常捕獲和處理的資料請關注腳本之家其它相關文章!

相關文章

  • Spring Security實現(xiàn)動態(tài)路由權限控制方式

    Spring Security實現(xiàn)動態(tài)路由權限控制方式

    這篇文章主要介紹了Spring Security實現(xiàn)動態(tài)路由權限控制方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java中@JSONField和@JsonProperty注解的用法及區(qū)別詳解

    Java中@JSONField和@JsonProperty注解的用法及區(qū)別詳解

    @JsonProperty和@JSONField注解都是為了解決obj轉(zhuǎn)json字符串的時候,將java bean的屬性名替換成目標屬性名,下面這篇文章主要給大家介紹了關于Java中@JSONField和@JsonProperty注解的用法及區(qū)別的相關資料,需要的朋友可以參考下
    2024-06-06
  • 一文徹底搞定VSCode?Java環(huán)境配置(解決JDK版本總對不上)

    一文徹底搞定VSCode?Java環(huán)境配置(解決JDK版本總對不上)

    在Java開發(fā)中,不同項目可能依賴不同版本的JDK,合理配置VSCode中的JDK環(huán)境至關重要,這篇文章主要介紹了如何徹底搞定VSCode Java環(huán)境配置的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-03-03
  • Springboot如何使用外部yml啟動

    Springboot如何使用外部yml啟動

    這篇文章主要介紹了Springboot如何使用外部yml啟動問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • springboot加載命令行參數(shù)ApplicationArguments的實現(xiàn)

    springboot加載命令行參數(shù)ApplicationArguments的實現(xiàn)

    本文主要介紹了springboot加載命令行參數(shù)ApplicationArguments的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • java格式化數(shù)值成貨幣格式示例

    java格式化數(shù)值成貨幣格式示例

    這篇文章主要介紹了java格式化數(shù)值成貨幣格式示例,格式化一個數(shù)值,比如123456789.123,希望顯示成"$123,456,789.123",需要的朋友可以參考下
    2014-04-04
  • SpringBoot實現(xiàn)JWT token自動續(xù)期的示例代碼

    SpringBoot實現(xiàn)JWT token自動續(xù)期的示例代碼

    本文主要介紹了SpringBoot實現(xiàn)JWT token自動續(xù)期的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • java應用開發(fā)之Mybatis通過Mapper代理自定義接口的實現(xiàn)

    java應用開發(fā)之Mybatis通過Mapper代理自定義接口的實現(xiàn)

    這篇文章主要介紹了java應用開發(fā)之Mybatis通過Mapper代理自定義接口的實現(xiàn)方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • Java反射機制介紹

    Java反射機制介紹

    Java的反射機制是在運行狀態(tài)中,對于任何一個類,都可以知道這個類的所有屬性和方法,對于任何一個對象,都可以調(diào)用它所有的方法和屬性,修改部分類型信息,這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為Java的反射機制
    2022-08-08
  • Mybatis配置之<typeAliases>別名配置元素解析

    Mybatis配置之<typeAliases>別名配置元素解析

    這篇文章主要介紹了Mybatis配置之<typeAliases>別名配置元素解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論

屯门区| 措勤县| 堆龙德庆县| 潞西市| 光泽县| 富源县| 利辛县| 玉树县| 鹤岗市| 洞头县| 卢氏县| 永福县| 德昌县| 弥勒县| 镇康县| 镇远县| 射洪县| 长沙市| 五莲县| 安乡县| 鲁山县| 石城县| 苏尼特右旗| 大渡口区| 犍为县| 西华县| 奉贤区| 磐安县| 通海县| 达拉特旗| 历史| 华池县| 始兴县| 安仁县| 额济纳旗| 临澧县| 方山县| 盈江县| 印江| 郓城县| 阿拉善左旗|