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

Java?Exception異常全方面分析

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

如下實(shí)例:

public class Demo {
    public static void main(String[] args) {
        int num = 2/0;
    }
}

這段代碼中“除0”的邏輯在C語(yǔ)言中就只是報(bào)個(gè)警告,但是Java是比較安全的語(yǔ)言,在編譯運(yùn)行的時(shí)候會(huì)直接拋出異常

那么到底什么是異常?

一、什么是異常?

異常指的是在程序運(yùn)行過(guò)程中發(fā)生的異常事件,通常是由外部問(wèn)題(如硬件錯(cuò)誤、輸入錯(cuò)誤)所導(dǎo)致的。在Java等面向?qū)ο蟮木幊陶Z(yǔ)言中異常屬于對(duì)象.

異常本身是一個(gè)對(duì)象,產(chǎn)生異常就是產(chǎn)生了一個(gè)異常對(duì)象

Java的異常體系

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-oL91wEfr-1645859727173)(C:\Users\LY\AppData\Roaming\Typora\typora-user-images\image-20220110210046681.jpg)]

我們都知道Java中所有類(lèi)都是繼承自O(shè)bject的,Throwable這個(gè)類(lèi)也是如此,如下Java官方文檔

我們可以看到

繼承于throwable類(lèi)的有兩個(gè),一個(gè)是Error(錯(cuò)誤),一個(gè)是Exception(異常),throwable是Java中所有錯(cuò)誤和異常的父類(lèi)

而異常又分為受查異常和非受查異常(我們之前碰到過(guò)的除0發(fā)生的異常就是非受查異常)

非受查異常:Java語(yǔ)言規(guī)范將派生于 Error 類(lèi)或 RuntimeException 類(lèi)的所有異常稱(chēng)為非受查異常(因?yàn)槌绦虻拇aBug導(dǎo)致的問(wèn)題,空指針異常,數(shù)組下標(biāo)越界異常)

受查異常:所有的其他異常稱(chēng)為 受查異常(程序編譯時(shí)拋出的異常),必須處理,否則代碼編譯不能通過(guò)(一些可以經(jīng)過(guò)重試或者程序自動(dòng)修復(fù)可以解決的問(wèn)題)

錯(cuò)誤:因?yàn)樵O(shè)備或其他硬性環(huán)境導(dǎo)致的,程序根本無(wú)法修復(fù)的問(wèn)題

如何排查異常

如下代碼:

在文章開(kāi)頭寫(xiě)的一個(gè)"除0"代碼的運(yùn)行結(jié)果:

這里面java.lang.ArithmeticException是異常的種類(lèi),by zero是異常的具體信息

常見(jiàn)的異常種類(lèi)有:

NullPointerException:空指針異常

ArithmeticException:算術(shù)異常

ArrayIndexOutOfBoundsException:數(shù)組下標(biāo)越界異常

PS:異常的種類(lèi)有很多,不同的異常具有不同的含義,也有不同的處理方式

有的時(shí)候異常信息會(huì)有很多行,這些異常信息被稱(chēng)為異常信息棧/異常跟蹤棧,那么我們?nèi)绾卧谶@些異常信息中找到引發(fā)異常的第一現(xiàn)場(chǎng)呢?

直接點(diǎn)擊最上面第一條異常信息的藍(lán)色部分,光標(biāo)就會(huì)自動(dòng)跳轉(zhuǎn)到引發(fā)異常的地方,從而進(jìn)行相應(yīng)的修改

二、 處理異常

Java當(dāng)中異常的核心思想其實(shí)就是讓我們先操作,在操作過(guò)程中遇到問(wèn)題再處理

try…catch基本語(yǔ)法

try{
有可能出現(xiàn)異常的語(yǔ)句;
}[catch (異常類(lèi)型 異常對(duì)象) {
捕捉try當(dāng)中可能出現(xiàn)的異常;
可以寫(xiě)多個(gè)catch;
} ... ]
[finally {
異常的出口;
可以不寫(xiě);
finally中的代碼一定會(huì)被執(zhí)行,用來(lái)做一些善后工作;
}]

  • try 代碼塊中放的是可能出現(xiàn)異常的代碼.
  • catch 代碼塊中放的是出現(xiàn)異常后的處理行為
  • finally 代碼塊中的代碼用于處理善后工作, 會(huì)在最后執(zhí)行.
  • 其中 catch 和 finally 都可以根據(jù)情況選擇加或者不加.

我們還是以"除0"問(wèn)題為例

public static void main(String[] args) {
    int a = 10/0;
    System.out.println("666");
}

這個(gè)程序顯然到了int a = 10/0;就會(huì)拋出異常,后面的666不會(huì)被打印出來(lái)

此處發(fā)生異常,程序會(huì)直接交給JVM處理異常,導(dǎo)致的結(jié)果是程序會(huì)立即停止,不再向下執(zhí)行

那么我們?nèi)绻胍尦绦蚶^續(xù)往下執(zhí)行呢?

這個(gè)時(shí)候就要處理異常

public static void main(String[] args) {
    try {
        int a = 10 / 0;
    } catch (ArithmeticException e) {
        e.printStackTrace();
    }
     System.out.println("666");
}

在try中放入可能會(huì)引發(fā)異常的語(yǔ)句,在catch后面的圓括號(hào)內(nèi)寫(xiě)入想要捕獲異常的種類(lèi)ArithmeticException,然后就可以對(duì)此異常做出處理,e.printStackTrace();打印異常追蹤棧,最后再打印666

運(yùn)行結(jié)果:

當(dāng)程序拋出異常的時(shí)候,由catch塊進(jìn)行捕獲,程序自己來(lái)處理異常,導(dǎo)致的結(jié)果就是程序會(huì)繼續(xù)向下執(zhí)行

注意:如果catch中要捕獲的異常種類(lèi)和實(shí)際發(fā)生異常的種類(lèi)不一樣的話(huà),就還是交給JVM處理了,程序立即停止

如果我們用Exception來(lái)捕獲異常呢?

如下代碼

public static void main(String[] args) {
    try {
        int a = 10 / 0;
    }catch (Exception e) {
        System.out.println(999);
    }catch (ArithmeticException e) {
        System.out.println(888);
    }     // 直接捕獲Exception的話(huà),后面的這些catch就沒(méi)啥用了,編譯器就會(huì)報(bào)錯(cuò)
    System.out.println("666");
}   

所有異常繼承于Exception,那么當(dāng)出現(xiàn)異常的時(shí)候,Exception可以捕獲所有的異常,這樣只需要寫(xiě)一個(gè)捕獲Exception的catch就行了,但是不建議這么寫(xiě),這樣得不到具體的異常種類(lèi)

finally

無(wú)論catch有沒(méi)有捕獲到異常,finally塊中的代碼都會(huì)在最后被執(zhí)行

public static void main(String[] args) {
    try {
        int a = 10 / 0;
        System.out.println("666");
    }catch (ArithmeticException e) {
        System.out.println("888");
    }finally {
        System.out.println("999");
    }
    System.out.println("777");
}

在方法中出現(xiàn)異常

如果本方法中沒(méi)有合適的處理異常的方式,就會(huì)沿著調(diào)用棧向上傳遞

public class ExceptionLearning {
    public static void demo() {
        int a = 10/0;
    }
    public static void main(String[] args) {
        demo();
    }
}

運(yùn)行結(jié)果:

在demo方法中執(zhí)行時(shí),拋出算術(shù)異常,因?yàn)閐emo方法是被main方法調(diào)用的,所以demo就會(huì)讓main方法來(lái)處理異常,但是main方法中也沒(méi)有處理異常,就會(huì)交給JVM來(lái)處理,程序就會(huì)異常終止

若對(duì)異常做出處理

public class ExceptionLearning {
    public static void demo() {
        int a = 10/0;
    }
    public static void main(String[] args) {
        try {
            demo();
        }catch (ArithmeticException e) {
            e.printStackTrace();
        }finally {
            System.out.println("繼續(xù)向下執(zhí)行");
        }
    }
}

在demo方法中執(zhí)行時(shí),拋出算術(shù)異常,因?yàn)閐emo方法是被main方法調(diào)用的,所以demo就會(huì)讓main方法來(lái)處理異常,main方法中對(duì)異常做出處理,程序繼續(xù)向下執(zhí)行

異常處理流程

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

手動(dòng)拋出異常

除了Java編譯器來(lái)拋出異常以外,我們也可以自己針對(duì)一些情況來(lái)拋出異常

三、自定義異常

要知道,異常本身就是一個(gè)對(duì)象,它肯定是對(duì)應(yīng)一個(gè)類(lèi)的,那么我們也可以通過(guò)創(chuàng)建類(lèi)的方式來(lái)自定義異常

源碼剖析

我們這里以Arithmetic類(lèi)為例,可以先看看它的源碼

從源碼中會(huì)發(fā)現(xiàn)Arithmetic這個(gè)類(lèi)繼承自RuntimeException類(lèi),并且有兩個(gè)構(gòu)造方法,一個(gè)有參,一個(gè)無(wú)參

自定義

我們也可以仿照Arithmetic來(lái)自定義,如下代碼

class MyException extends RuntimeException{
    public MyException() {
        super();
    }
    public MyException(String str) {
        super(str);
    }
}
public class ExceptionLearning {
    public static void main(String[] args) throws MyException{   //在方法上加上異常說(shuō)明, 相當(dāng)于將處理動(dòng)作交給上級(jí)調(diào)用者
        int b = 0;
        if (b == 0) {
            throw new MyException("b == 0");
        }
    }
}

運(yùn)行結(jié)果

注意

當(dāng)我們將MyException繼承于RuntimeException的時(shí)候,這個(gè)異常就默認(rèn)是非受查異常;繼承于Exception的時(shí)候,這個(gè)異常就默認(rèn)是受查異常

Java針對(duì)受查異常,強(qiáng)制要求: 一個(gè)方法如果拋出了受查異常,則必須通過(guò)throws聲明異常;如果拋出了非受查異常,則必須聲明

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

相關(guān)文章

  • SpringMVC的執(zhí)行過(guò)程淺析

    SpringMVC的執(zhí)行過(guò)程淺析

    這篇文章主要給大家介紹了關(guān)于SpringMVC的執(zhí)行過(guò)程的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用SpringMVC具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 基于JTable的列寬與內(nèi)容自適應(yīng)的實(shí)現(xiàn)方法

    基于JTable的列寬與內(nèi)容自適應(yīng)的實(shí)現(xiàn)方法

    本篇文章是對(duì)JTable的列寬與內(nèi)容自適應(yīng)的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • SpringBoot 啟動(dòng)方法run()源碼解析

    SpringBoot 啟動(dòng)方法run()源碼解析

    這篇文章主要介紹了SpringBoot 啟動(dòng)方法run()源碼賞析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 使用@ConfigurationProperties注解獲取為null的解決方法

    使用@ConfigurationProperties注解獲取為null的解決方法

    在SpringBoot中,當(dāng)想需要獲取到配置文件數(shù)據(jù)時(shí),除了可以用 Spring 自帶的@Value注解外,SpringBoot還提供了一種更加方便的方式:@ConfigurationProperties,但我們?cè)谕ㄟ^(guò)通過(guò)get方法去取值一直為null,本文介紹了使用@ConfigurationProperties注解獲取為null的解決方法
    2024-09-09
  • Java由淺入深通關(guān)抽象類(lèi)與接口下

    Java由淺入深通關(guān)抽象類(lèi)與接口下

    在類(lèi)中沒(méi)有包含足夠的信息來(lái)描繪一個(gè)具體的對(duì)象,這樣的類(lèi)稱(chēng)為抽象類(lèi),接口是Java中最重要的概念之一,它可以被理解為一種特殊的類(lèi),不同的是接口的成員沒(méi)有執(zhí)行體,是由全局常量和公共的抽象方法所組成,本文給大家介紹Java抽象類(lèi)和接口,感興趣的朋友一起看看吧
    2022-04-04
  • springmvc和js前端的數(shù)據(jù)傳遞和接收方式(兩種)

    springmvc和js前端的數(shù)據(jù)傳遞和接收方式(兩種)

    本文介紹了springmvc和js前端的數(shù)據(jù)傳遞和接收方式(兩種),詳細(xì)的介紹了兩種方式,一種是json格式傳遞,另一種是Map傳遞,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-12-12
  • java與c#的語(yǔ)法區(qū)別詳細(xì)介紹

    java與c#的語(yǔ)法區(qū)別詳細(xì)介紹

    由C#轉(zhuǎn)入Java一段時(shí)間了,總結(jié)下個(gè)人認(rèn)為的Java同C#語(yǔ)法之間的不同之處,有不同意見(jiàn)之處還望各位海涵,剛學(xué)Java時(shí)覺(jué)得語(yǔ)法同C#大致是相同的(應(yīng)該說(shuō)C#同Java大致相同
    2012-11-11
  • 關(guān)于SpringMVC請(qǐng)求域?qū)ο蟮臄?shù)據(jù)共享問(wèn)題

    關(guān)于SpringMVC請(qǐng)求域?qū)ο蟮臄?shù)據(jù)共享問(wèn)題

    這篇文章主要介紹了SpringMVC請(qǐng)求域?qū)ο蟮臄?shù)據(jù)共享問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Spring容器初始化及問(wèn)題解決方案

    Spring容器初始化及問(wèn)題解決方案

    這篇文章主要介紹了Spring容器初始化及問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 深入探究如何使用Java編寫(xiě)MapReduce程序

    深入探究如何使用Java編寫(xiě)MapReduce程序

    MapReduce是一種用于處理大規(guī)模數(shù)據(jù)集的并行編程模型,其特點(diǎn)高效性和可擴(kuò)展性,在本文中,我們將深入了解MapReduce,并使用Java編寫(xiě)一個(gè)簡(jiǎn)單的MapReduce程序,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

万盛区| 大埔区| 蓝田县| 酒泉市| 高安市| 巴马| 恭城| 临江市| 理塘县| 乌兰浩特市| 镇巴县| 犍为县| 富川| 临沂市| 克东县| 郁南县| 即墨市| 深圳市| 井陉县| 宜兰市| 吉林省| 曲水县| 中宁县| 都昌县| 新密市| 青龙| 博客| 成武县| 玛沁县| 禄丰县| 溧水县| 栖霞市| 邵武市| 沭阳县| 汤原县| 崇州市| 巩留县| 会泽县| 密云县| 南木林县| 阿拉善左旗|