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

Java異常類型以及處理實(shí)例詳解

 更新時間:2021年07月09日 14:49:26   作者:哦呦呦呦呦  
在程序設(shè)計中,進(jìn)行異常處理是非常關(guān)鍵和重要的一部分,一個程序的異常處理框架的好壞直接影響到整個項(xiàng)目的代碼質(zhì)量以及后期維護(hù)成本和難度,這篇文章主要給大家介紹了關(guān)于Java異常類型以及處理的相關(guān)資料,需要的朋友可以參考下

一、異常的描述

程序運(yùn)行時,發(fā)生的不被期望的事件,它阻止了程序按照程序員的預(yù)期正常執(zhí)行,這就是異常。異常發(fā)生時,是任程序自生自滅,立刻退出終止。在Java中即,Java在編譯或運(yùn)行或者運(yùn)行過程中出現(xiàn)的錯誤。

Java提供了更加優(yōu)秀的解決辦法:異常處理機(jī)制。

異常處理機(jī)制能讓程序在異常發(fā)生時,按照代碼的預(yù)先設(shè)定的異常處理邏輯,針對性地處理異常,讓程序盡最大可能恢復(fù)正常并繼續(xù)執(zhí)行,且保持代碼的清晰。

Java中的異??梢允呛瘮?shù)中的語句執(zhí)行時引發(fā)的,也可以是程序員通過throw 語句手動拋出的,只要在Java程序中產(chǎn)生了異常,就會用一個對應(yīng)類型的異常對象來封裝異常,JRE就會試圖尋找異常處理程序來處理異常。

  • 異常指在運(yùn)行時期發(fā)生的不正常情況。
  • 在java中用類的形式對不正常情況進(jìn)行了描述和封裝對象。
  • 描述不正常情況的類,就成為異常類。
  • 將正常代碼和問題處理代碼分離,提高閱讀性。
  • 其實(shí)異常就是java通過面向?qū)ο蟮乃枷雽栴}封裝成了對象,用異常類對其進(jìn)行描述。

二、異常的體系

兩大類:

  • hrowable:可拋出的異常,無論是error還是exception,問題發(fā)生就應(yīng)該可以拋出,讓調(diào)用者知道并且處理。
  • 該體系的特點(diǎn)就是在于Throwable及其所有的子類都具有可拋性。

可拋性到底指的是什么?怎么體現(xiàn)可拋性呢?

  • 通過兩個關(guān)鍵字來體現(xiàn)的。
  • throws throw 凡是可以被這兩個關(guān)鍵字所操作的類和對象都具有可拋性。
  • 子類1  一般不可處理的。————Error
  • 特點(diǎn):是由jvm拋出的嚴(yán)重性問題,這種問題發(fā)生一般不針對性處理,直接修改程序。
  • 子類2)可以處理的?!狤xception,問題拋給調(diào)用者,誰用拋給誰。
  • 特點(diǎn):子類后綴名都是用其父類名作為后綴名,閱讀性很強(qiáng)!

范例:比如自定義一個負(fù)數(shù)角標(biāo)的異常,使用面向?qū)ο笏枷敕庋b成對象。

  • 注意:如果讓一個類稱為異常類,必須要繼承異常類。因?yàn)橹挥挟惓sw系的子類才具有可拋性。
class FuShuIndex extends Exception{
                //構(gòu)造函數(shù) 和類名一樣
                FuShuIndex(){  
                }
                //定義一個帶參數(shù)的構(gòu)造函數(shù)
                FuShuIndex(String msg){
                    //調(diào)用Exception中的帶參數(shù)異常函數(shù)
                    super(msg);  
                }
            }
            主函數(shù) throws FuShuIndex:{
               int[] arr = new int[3];
               method(arr,-7);
            }
            public static int method(int[] arr,int index) throws arrIndexexception {
                 if (index<0){
                    throw new arrIndexexception("數(shù)組的角標(biāo)不能為負(fù)數(shù)");
                 }
                return arr[index];
            }

三、異常的分類:

編譯時被檢測異常還要是Exception和其子類都是,除了特殊子類RuntimeException體系未處理即編譯失??!

  • 這種問題一旦出現(xiàn),希望在編譯時就進(jìn)行檢測,讓這種問題有相應(yīng)的處理方式,這樣的問題都可以針對性處理。

編譯時不被檢測異常(運(yùn)行時異常):RuntimeException和其子類

  • 可處理可不處理,編譯都可以通過,運(yùn)行時會檢測!
  • 這種問題的發(fā)生,無法讓功能繼續(xù),運(yùn)算無法運(yùn)行,更多因?yàn)檎{(diào)用的原因?qū)е?,或者引發(fā)了內(nèi)部狀態(tài)的改變導(dǎo)致的。這種問題一般不處理,直接編譯通過,在運(yùn)行時,讓調(diào)用者時程序強(qiáng)制停止,讓調(diào)用者對代碼進(jìn)行修正。

throws和throw的區(qū)別:

  • throws使用在函數(shù)上  ————申明
  • throw使用在函數(shù)內(nèi),可以拋出多個,用逗號隔開。 ————拋出
  • throws拋出的是異常類,可以拋出多個。
  • throw拋出的是異常對象。

四、異常處理的捕捉形式

這是可以對異常進(jìn)行針對性處理的方式。

格式:

try{
            //需要被檢測異常的代碼
        }
        catch(異常類 變量)//該變量用于接收發(fā)生的異常對象{
            //處理異常代碼
        }
        finally{
            //一定會被執(zhí)行的代碼
      }

范例

class FuShuIndex extends Exception{
            //構(gòu)造函數(shù) 和類名一樣
            FuShuIndex(){  
            }
            //定義一個帶參數(shù)的構(gòu)造函數(shù)
            FuShuIndex(String msg){
                //調(diào)用Exception中的帶參數(shù)異常函數(shù)
                super(msg);  
            }
  }

主函數(shù):無需throws拋出,下面我們自己捕獲異常

{
           int[] arr = new int[3];
           try{
           method(arr,-7);
           }catch(arrIndexexception a){
                a.printStackTrace();//jvm默認(rèn)的異常處理機(jī)制就是調(diào)用異常對象的這個方法。
                System.out.println("數(shù)組的角標(biāo)異常?。?!");//自定義捕獲后打印的信息
                System.out.println(a.toString());//打印該異常對象的信息
                System.out.println(a.getMessage());//獲取我們自定義拋出所定義的信息
                }
  }
public static int method(int[] arr,int index) throws arrIndexexception {
             if (index<0){
                throw new arrIndexexception("數(shù)組的角標(biāo)不能為負(fù)數(shù)");
             }
            return arr[index];
 }

一個try對應(yīng)多個catch:

  • 多catch情況下,父類的catch要放在最下面,否則編譯為空。

五、異常處理的原則

函數(shù)內(nèi)部如果拋出了需要檢測的異常,那么函數(shù)上必須申明,或者必須在函數(shù)內(nèi)用try catch捕捉,否則編譯失敗。

如果調(diào)用到了申明異常的函數(shù),要么try catch 或者 throws ,否則編譯失敗。

什么時候catch?什么時候throws?

  • 功能內(nèi)容可以解決,用catch。
  • 解決不了,用throws告訴調(diào)用者,由調(diào)用者解決。

一個功能如果拋出了多個異常,那么調(diào)用時,必須有對應(yīng)的多個catch來進(jìn)行針對性處理。

  • 內(nèi)部有幾個需要檢測的異常,就拋幾個異常,拋出幾個就catch幾個異常。

六、finally

通常用于關(guān)閉(釋放)資源。必須要執(zhí)行。除非jvm虛擬機(jī)掛了。

范例:出門玩,必須關(guān)門,所以將關(guān)門這個動作放在finally里面,必須執(zhí)行。

凡是涉及到關(guān)閉連接等操作,要用finally代碼塊來釋放資源。

try catch finally 代碼塊組合特點(diǎn):

  • try catch finally:當(dāng)有資源需要釋放時,可以定義finally
  • try catch(多個):當(dāng)沒有資源需要釋放時,可以不定義finally
  • try finally:異常處理不處理我不管,但是我得關(guān)閉資源,因?yàn)橘Y源是我開的,得在內(nèi)部關(guān)掉資源。

范例:

try{
                    //連接數(shù)據(jù)庫
                }
                    //沒有catch意思不處理異常,只單純的捕獲異常
                finally{
                    //關(guān)閉連接
                }

七、異常的應(yīng)用

老師用電腦講課范例:

電腦類:

public class Computer {
                private int state = 2;
                public void run() throws lanpingExcption,maoyanExcption{
                    if (state == 1){
                        throw new lanpingExcption("電腦藍(lán)屏啦~");
                    }else if (state == 2){
                        throw new maoyanExcption("電腦冒煙啦~");
                    }
                    System.out.println("電腦啟動");
                }
                public void chongqi(){
                    state = 0;
                    System.out.println("重啟電腦!");
                }
  }

老師類:

public class Teacher {
            private String name;
            private Computer computer;
            Teacher(String name){
                this.name = name;
                computer = new Computer();
            }

            void teach() throws maoyanExcption{
                try {
                    computer.run();
                    System.out.println(this.name + "開始用電腦講課了");
                } catch (lanpingExcption l) {
                    l.printStackTrace();
                    computer.chongqi();
                    teach();//重啟后再次講課
                } catch (maoyanExcption m) {
                    m.printStackTrace();
                    test();
                    throw m;
                }
            }

            public void test(){
                System.out.println("大家自己練習(xí)去~");
            }

  }

藍(lán)屏異常類:

public class lanpingExcption extends Exception{
            lanpingExcption (String msg){
                 super(msg);
            }
 }

冒煙異常類:

public class maoyanExcption extends Exception {
            maoyanExcption (String msg){
                super(msg);
            }
}

主函數(shù):

public class Testmain {
            public static void main (String[] args){
                Teacher teacher = new Teacher("丁老師");
                try {
                    teacher.teach();
                } catch (maoyanExcption m) {
                    //m.printStackTrace();
                    System.out.println("。。。。。");
                }
            }
    }

八、異常的注意事項(xiàng):

  • 子類在覆蓋父類方法時,父類的方法如果拋出了異常,那么子類的方法只能拋出父類的異?;蛘咴摦惓5淖宇?。
  • 如果父類拋出多個異常,那么子類只能拋出父類異常的子集。
  • 子類覆蓋父類,只能拋出父類的異?;蛘咦宇?。
  • 如果父類的方法沒有拋出異常,子類覆蓋時絕對不能拋。

總結(jié)

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

相關(guān)文章

  • SpringBoot全局異常捕獲處理實(shí)現(xiàn)方案

    SpringBoot全局異常捕獲處理實(shí)現(xiàn)方案

    這篇文章主要詳細(xì)介紹了SpringBoot全局異常捕獲處理實(shí)現(xiàn)方案,文章通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • SpringBoot整合JWT Token的完整步驟

    SpringBoot整合JWT Token的完整步驟

    JSON Web Token是目前最流行的跨域認(rèn)證解決方案,適合前后端分離項(xiàng)目通過Restful API進(jìn)行數(shù)據(jù)交互時進(jìn)行身份認(rèn)證,這篇文章主要給大家介紹了關(guān)于SpringBoot整合JWT Token的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 一文詳解Java中流程控制語句

    一文詳解Java中流程控制語句

    在一個程序執(zhí)行的過程中,各條語句的執(zhí)行順序?qū)Τ绦虻慕Y(jié)果是有直接影響的。也就是說,程序的流程對運(yùn)行結(jié)果有直接的影響。所以,我們必須清楚每條語句的執(zhí)行流程。本文就來通過一些示例帶大家詳細(xì)了解一下
    2022-10-10
  • idea中如何創(chuàng)建scala項(xiàng)目

    idea中如何創(chuàng)建scala項(xiàng)目

    idea中創(chuàng)建scala項(xiàng)目有三種方式1.通過maven;2.通過idea;3.通過sbt的方式;本文就每種方法通過圖文并茂的形式給大家詳細(xì)介紹,需要的朋友參考下吧
    2021-07-07
  • MyBatis實(shí)現(xiàn)MySQL批量插入的示例代碼

    MyBatis實(shí)現(xiàn)MySQL批量插入的示例代碼

    本文主要介紹了MyBatis實(shí)現(xiàn)MySQL批量插入的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • java?ThreadPoolExecutor線程池內(nèi)部處理流程解析

    java?ThreadPoolExecutor線程池內(nèi)部處理流程解析

    這篇文章主要為大家介紹了java?ThreadPoolExecutor線程池內(nèi)部處理流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Mybatis-Plus使用saveOrUpdate及問題解決方法

    Mybatis-Plus使用saveOrUpdate及問題解決方法

    本文主要介紹了Mybatis-Plus使用saveOrUpdate及問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 基于JPA查詢部分字段的相關(guān)事項(xiàng)

    基于JPA查詢部分字段的相關(guān)事項(xiàng)

    這篇文章主要介紹了JPA查詢部分字段的相關(guān)事項(xiàng)說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 使用Java制作一個簡單的記事本

    使用Java制作一個簡單的記事本

    本文給大家?guī)淼氖鞘褂肑ava制作一個簡單的記事本的代碼,有相同需要的朋友可以參考下
    2015-02-02
  • 用Java實(shí)現(xiàn)簡單畫板功能

    用Java實(shí)現(xiàn)簡單畫板功能

    這篇文章主要為大家詳細(xì)介紹了用Java實(shí)現(xiàn)簡單畫板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評論

牡丹江市| 广灵县| 陇西县| 忻城县| 呈贡县| 噶尔县| 花垣县| 商丘市| 齐齐哈尔市| 寿阳县| 沁源县| 江达县| 昌乐县| 西华县| 瑞丽市| 忻城县| 四子王旗| 荣昌县| 钟山县| 乐都县| 寻乌县| 双柏县| 崇州市| 玛多县| 新宾| 内黄县| 岳池县| 富蕴县| 彝良县| 呼和浩特市| 西平县| 琼中| 牙克石市| 绥江县| 尼木县| 湖南省| 洛隆县| 临高县| 托克逊县| 日土县| 嘉荫县|