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

Java 超詳細(xì)講解異常的處理

 更新時(shí)間:2022年04月02日 10:36:42   作者:Pretend..  
異常就是不正常,比如當(dāng)我們身體出現(xiàn)了異常我們會(huì)根據(jù)身體情況選擇喝開(kāi)水、吃藥、看病、等 異常處理方法。 java異常處理機(jī)制是我們java語(yǔ)言使用異常處理機(jī)制為程序提供了錯(cuò)誤處理的能力,程序出現(xiàn)的錯(cuò)誤,程序可以安全的退出,以保證程序正常的運(yùn)行等

1、異常的概念和體系結(jié)構(gòu)

1.1異常的概念

Java中,在程序執(zhí)行過(guò)程中發(fā)生的不正常行為稱為異常。比如之前一直遇到的:

(1)算數(shù)異常

System.out.prinntln(10/0);

(2)數(shù)組越界異常

int[] arr={1,2,3};
System.out.println(arr[5]);

(3)空指針異常

int[] arr=null;
System.out.println(arr.length());

1.2異常的體系結(jié)構(gòu)及分類

  • Throwable:是異常體系的頂尖層,派生出兩個(gè)鐘要的子類:而Error、Exception
  • Error:指的是Java虛擬機(jī)無(wú)法解決的嚴(yán)重問(wèn)題
  • Exception:就是我們平常所說(shuō)的異常。程序員可以以通過(guò)代碼進(jìn)行處理,使程序繼續(xù)執(zhí)行。

【異常的分類】

  • 運(yùn)行時(shí)異常(受查異常):RuntimeException下的所有異常為運(yùn)行時(shí)異常
  • 編譯時(shí)異常(非受查異常):IOException、ClassNotFoundException、CloneNotSupportedException為編譯時(shí)異常

【注】編譯時(shí)出現(xiàn)的語(yǔ)法錯(cuò)誤,不能稱之為異常。運(yùn)行時(shí)指的是程序已經(jīng)編譯通過(guò)得到class文件了,再由JVM執(zhí)行過(guò)程中出現(xiàn)的錯(cuò)誤。

2、異常的處理

在Java中,異常處理主要的五個(gè)關(guān)鍵字:throw、try、catch、final、throws

2.1防御式編程

(1)LBYL:look before you leap,在操作之前就做充足的檢查(事前防御型)

boolean ret=false;
ret=登陸游戲();
if(!ret){
    處理登陸游戲錯(cuò)誤;
    return;
}
ret=開(kāi)始匹配();
if(!ret){
    處理匹配錯(cuò)誤;
    return;
}
………………

缺陷:正常流程和錯(cuò)誤處理代碼混在一起,代碼整體顯得比較混亂。

(2)EAFP:it is easier to ask forgiveness than permission,先操作,遇到問(wèn)題再解決。(事后認(rèn)錯(cuò)型)

try{
   登陸游戲();
   開(kāi)始匹配();
}catch(登陸游戲異常){
    處理登陸游戲異常;
}catch(開(kāi)始匹配異常){
    處理匹配異常;
}

2.2異常地拋出

在Java中,可以借助throw關(guān)鍵字,拋出自定義異常,將錯(cuò)誤信息告知給調(diào)用者。語(yǔ)法如下:

throw  new  XXXException("異常產(chǎn)生的原因");

【例】實(shí)現(xiàn)一個(gè)方法,獲取數(shù)組中任意下標(biāo)位置的元素

public static int getElement(int[] array, int index){
        if(null == array){
            throw new NullPointerException("傳遞的數(shù)組為null");
        }
        if(index < 0 || index >= array.length){
            throw new ArrayIndexOutOfBoundsException("傳遞的數(shù)組下標(biāo)越界");
        }
        return array[index];
    }

【注】

  • throw必須寫(xiě)在方法的內(nèi)部
  • 拋出的對(duì)象必須是Exception或Exception的子類對(duì)象
  • 如果拋出的是編譯時(shí)異常,用戶必須處理,否則無(wú)法通過(guò)編譯
  • 如果拋出的是RuntimeException或其子類,可以不用處理,直接交給JVM來(lái)處理
  • 異常一旦拋出,后面的代碼不會(huì)再執(zhí)行

2.3異常的捕獲

異常的具體處理方式,主要有兩種:異常聲明throws和try-catch捕獲處理

printStackTrace()打印異常

(1)異常聲明throws

當(dāng)前方法不處理異常,提醒方法的調(diào)用者處理異常。

語(yǔ)法格式:

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

【例】加載指定的配置文件

public class Config {
        File file;
        /*
        FileNotFoundException : 編譯時(shí)異常,表明文件不存在
        此處不處理,也沒(méi)有能力處理,應(yīng)該將錯(cuò)誤信息報(bào)告給調(diào)用者,讓調(diào)用者檢查文件名字是否給錯(cuò)誤了
        */
        public void OpenConfig(String filename) throws FileNotFoundException {
            if(filename.equals("config.ini")){
                throw new FileNotFoundException("配置文件名字不對(duì)");
            }
        // 打開(kāi)文件
        }

【注】

  • throws必須跟在參數(shù)列表的后面。
  • 聲名的異常必須是Exception或Exception的子類。
  • 方法的內(nèi)部如果拋出多個(gè)異常,throws后面必須跟多個(gè)異常類型,用逗號(hào)隔開(kāi)。如果拋出的異常之間有父子關(guān)系,直接聲明父類異常即可。
  • 調(diào)用聲明拋出異常的方法時(shí),調(diào)用者必須對(duì)異常進(jìn)行處理,或者繼續(xù)使用throws。

(2)try-catch捕獲并處理

throws并沒(méi)有對(duì)異常真正處理,而是將異常報(bào)告給異常方法的調(diào)用者。如果真正要對(duì)異常進(jìn)行處理,需要try-catch。

【語(yǔ)法如下】

try{
    // 將可能出現(xiàn)異常的代碼放在這里
}catch(要捕獲的異常類型 e){
    // 如果try中的代碼拋出異常了,此處catch捕獲時(shí)異常類型與try中拋出的異常類型一致時(shí),或者是try中拋出異常的父類時(shí),就會(huì)被捕獲到
    // 對(duì)異常就可以正常處理,處理完成后,跳出try-catch結(jié)構(gòu),繼續(xù)執(zhí)行后序代碼
}【catch(異常類型 e){
    // 對(duì)異常進(jìn)行處理
}finally{
    // 此處代碼一定會(huì)被執(zhí)行到
}】
// 后序代碼
// 當(dāng)異常被捕獲到時(shí),異常就被處理了,這里的后序代碼一定會(huì)執(zhí)行
// 如果捕獲了,由于捕獲時(shí)類型不對(duì),那就沒(méi)有捕獲到,這里的代碼就不會(huì)被執(zhí)行

注意: 
1. 【】中表示可選項(xiàng),可以添加,也可以不用添加 
2. try中的代碼可能會(huì)拋出異常,也可能不會(huì)

【注意】

  • try塊中拋出異常位置后的代碼不會(huì)被執(zhí)行
  • 如果拋出異常類型與catch類型不匹配,即異常不會(huì)被成功捕獲,則需要JVM來(lái)處理異常------異常是按照類型來(lái)捕獲的。
  • rey中可能會(huì)拋出多個(gè)不同的異常對(duì)象,必須用多個(gè)catch來(lái)捕獲。
  • 如果異常之間有父子類關(guān)系,必須子類異常在前catch,父類異常在后catch,否則語(yǔ)法錯(cuò)誤。
  • 可以通過(guò)一個(gè)catch來(lái)捕獲多個(gè)異常(不推薦)。

由于Exception類是所有異常的子類,因此可以用這個(gè)類型來(lái)捕捉所有異常。catch進(jìn)行類型匹配時(shí),不光會(huì)匹配相同類型的異常對(duì)象,也會(huì)捕捉目標(biāo)異常類型的子類對(duì)象。

(3)finally

在寫(xiě)程序時(shí),有些特定的代碼,無(wú)論程序是否發(fā)生異常,都需要執(zhí)行,比如程序正常打開(kāi)的資源,有時(shí)候必須對(duì)資源進(jìn)行回收。另外,異常會(huì)引發(fā)程序的跳轉(zhuǎn),可能導(dǎo)致有些語(yǔ)句執(zhí)行不到,此時(shí)需要finally來(lái)解決這個(gè)問(wèn)題。

【語(yǔ)法格式】

try{
    // 可能會(huì)發(fā)生異常的代碼
}catch(異常類型 e){
    // 對(duì)捕獲到的異常進(jìn)行處理
}finally{
    // 此處的語(yǔ)句無(wú)論是否發(fā)生異常,都會(huì)被執(zhí)行到
}
// 如果沒(méi)有拋出異常,或者異常被捕獲處理了,這里的代碼也會(huì)執(zhí)行

【問(wèn)題】既然finally和try-catch-finally后的代碼都會(huì)被執(zhí)行,那為什么還要有finally呢?

當(dāng)catch沒(méi)有捕獲到異常時(shí),此時(shí)需要JVM來(lái)捕獲異常,程序可能不能正常運(yùn)行,finally后面的代碼就不會(huì)被執(zhí)行。而finally中的代碼一定會(huì)被執(zhí)行。

【注】finally中的代碼一定會(huì)被執(zhí)行,一般在其中進(jìn)行資源清理的掃尾工作。

如下代碼:

public static int func(){
   try{
      return 10;
   }finally{
      return 20;
   }
}
//此時(shí)返回20;

finally執(zhí)行的時(shí)機(jī)是方法返回之前(try或者catch中如果有return會(huì)在return之前執(zhí)行finally)。但是如果finally中也存在return語(yǔ)句,那么就會(huì)執(zhí)行finally中的return,從而不會(huì)執(zhí)行到try中原有的return。

2.4異常的處理流程

關(guān)于“調(diào)用棧”:

方法之間存在相互調(diào)用的關(guān)系,可以用“調(diào)用棧”來(lái)描述。在JVM中有一塊內(nèi)存空間稱之為:“虛擬機(jī)棧”專門存儲(chǔ)方法之間的調(diào)用關(guān)系。當(dāng)代碼中出現(xiàn)異常的時(shí)候,我們就可以使用e.printStackTrace();的方法查看出現(xiàn)異常代碼的調(diào)用棧。

如果本方法中沒(méi)有合適的處理異常的方法,就會(huì)沿著調(diào)用棧向上傳遞,如果一直向上傳遞都沒(méi)有找到合適的方法,最終會(huì)交給JVM來(lái)處理,程序就會(huì)異常終止。

【程序異常處理的流程】

  • 程序先執(zhí)行try中的代碼
  • 如果try中的代碼出現(xiàn)異常,就會(huì)結(jié)束try,在catch中進(jìn)行異常匹配
  • 如果找到匹配的異常類型,就會(huì)執(zhí)行catch中的代碼
  • 如果沒(méi)有找到,就會(huì)將異常向上傳遞到上層調(diào)用者
  • 無(wú)論是否找到匹配的異常類型,finally中的代碼都會(huì)執(zhí)行(在該方法結(jié)束之前執(zhí)行)
  • 如果上層調(diào)用者也不能處理異常,就繼續(xù)向上傳遞
  • 一直到main方法也沒(méi)有合適的代碼處理異常,就會(huì)交給JVM來(lái)處理,此時(shí)程序異常終止。

3、自定義異常類

具體方法:

  • 自定義異常類,然后繼承自Exception或者RunTimeException。
  • 實(shí)現(xiàn)一個(gè)帶有String類型參數(shù)的構(gòu)造方法。
class UserNameException extends Exception {
    public UserNameException(String message) {
        super(message);
    }
}

【注】

  • 自定義異常通常會(huì)繼承自Exception或者RunTimeException。
  • 繼承自Exception的異常默認(rèn)為受查異常。
  • 繼承自RunTimeException的異常默認(rèn)為非受查異常。

到此這篇關(guān)于Java 超詳細(xì)講解異常的處理的文章就介紹到這了,更多相關(guān)Java 異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)與算法之并查集(不相交集合)

    數(shù)據(jù)結(jié)構(gòu)與算法之并查集(不相交集合)

    并查集是一種挺高效的數(shù)據(jù)結(jié)構(gòu)。實(shí)現(xiàn)簡(jiǎn)單,只是所有元素統(tǒng)一遵從一個(gè)規(guī)律所以讓辦事情的效率高效起來(lái)。這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法——并查集(不相交集合),需要的朋友可以參考下
    2019-11-11
  • springboot+vue實(shí)現(xiàn)驗(yàn)證碼功能

    springboot+vue實(shí)現(xiàn)驗(yàn)證碼功能

    這篇文章主要為大家詳細(xì)介紹了springboot+vue實(shí)現(xiàn)驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java 實(shí)現(xiàn)當(dāng)前時(shí)間加減30分鐘的時(shí)間代碼

    java 實(shí)現(xiàn)當(dāng)前時(shí)間加減30分鐘的時(shí)間代碼

    這篇文章主要介紹了java 實(shí)現(xiàn)當(dāng)前時(shí)間加減30分鐘的時(shí)間代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • MyBatis批量插入的五種方式

    MyBatis批量插入的五種方式

    這篇文章主要介紹了MyBatis批量插入的五種方式,每種方式結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11
  • 使用spring?data的page和pageable如何實(shí)現(xiàn)分頁(yè)查詢

    使用spring?data的page和pageable如何實(shí)現(xiàn)分頁(yè)查詢

    這篇文章主要介紹了使用spring?data的page和pageable如何實(shí)現(xiàn)分頁(yè)查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java 實(shí)例解析單例模式

    Java 實(shí)例解析單例模式

    單例模式(Singleton Pattern)是 Java 中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式,這種模式涉及到一個(gè)單一的類,該類負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建
    2021-11-11
  • Java中String性能優(yōu)化

    Java中String性能優(yōu)化

    本文給大家分享的是如何在java中對(duì)String進(jìn)行性能優(yōu)化,使用String的時(shí)候需要有哪些注意事項(xiàng)呢,這就是今天我們要給大家總結(jié)分析的,有需要的小伙伴可以參考下。
    2015-03-03
  • Java用POI解析excel并獲取所有單元格數(shù)據(jù)的實(shí)例

    Java用POI解析excel并獲取所有單元格數(shù)據(jù)的實(shí)例

    下面小編就為大家?guī)?lái)一篇Java用POI解析excel并獲取所有單元格數(shù)據(jù)的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • 一問(wèn)詳解SpringBoot配置文件優(yōu)先級(jí)

    一問(wèn)詳解SpringBoot配置文件優(yōu)先級(jí)

    在SpringBoot項(xiàng)目當(dāng)中,我們要想配置一個(gè)屬性,可以通過(guò)這三種方式當(dāng)中的任意一種來(lái)配置都可以,那么優(yōu)先級(jí)怎么算,本文主要介紹了一問(wèn)詳解SpringBoot配置文件優(yōu)先級(jí),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java之SpringBoot實(shí)現(xiàn)基本增刪改查(前后端分離版)

    Java之SpringBoot實(shí)現(xiàn)基本增刪改查(前后端分離版)

    這篇文章主要介紹了Java中SpringBoot如何實(shí)現(xiàn)基本的增刪改查,前后端分離版,沒(méi)有和前端進(jìn)行聯(lián)系,感興趣的小伙伴可以借鑒閱讀本文
    2023-03-03

最新評(píng)論

江津市| 丽江市| 工布江达县| 霍州市| 西丰县| 文山县| 永泰县| 栖霞市| 阿瓦提县| 宁南县| 扎鲁特旗| 小金县| 焉耆| 温州市| 交口县| 云阳县| 清镇市| 延安市| 大埔区| 尉犁县| 班戈县| 台山市| 招远市| 长汀县| 云霄县| 滦平县| 合水县| 临城县| 中卫市| 阿瓦提县| 弋阳县| 衡阳市| 大港区| 舟曲县| 丁青县| 滨州市| 岢岚县| 巴中市| 屏东县| 永嘉县| 江永县|