欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳細(xì)介紹Java關(guān)鍵字throw?throws?Throwable的用法與區(qū)別

 更新時(shí)間:2022年04月25日 10:39:52   作者:紙照片  
這篇文章主要介紹了java中throws與throw及Throwable的用法和區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

throw,意為“投擲、拋、扔”。Throw、Throws和Throwable三者都用于異常處理。

1. Throwable

Throwable在Java中是異常處理這個(gè)分支的頂級(jí)父類,其它所有異常處理的實(shí)現(xiàn)都依賴于Throwable

打開Java官方文檔(Java8版本),找到Throwable,它的直接子類為Error和Exception。

Error和Exception兩者的特點(diǎn)在于Error異常程序無法處理,只能交由人工介入修改代碼,比如棧溢出、堆溢出等等;而Exception異??梢蕴崆鞍l(fā)覺,并作出有效處理。

1.1 擴(kuò)展-Error

在Error中,常見的有棧溢出和堆溢出等等。

舉個(gè)例子,StackOverflowError

public class ErrorTest {
    public static void main(String[] args) {
        main(args);
    }
}

無限遞歸,執(zhí)行這個(gè)程序就會(huì)報(bào)棧溢出異常。

再比如堆異常,OutOfMemoryError

public class ErrorTest {
    public static void main(String[] args) {
        Integer[] testArray = new Integer[1024*1024*1024];
    }
}

1.2 擴(kuò)展-Exception

在Exception中就有非常多我們所熟知的異常情況了,比如NullPointerException(空指針異常)、ArrayIndexOutOfBoundsException(數(shù)組下標(biāo)越界)、NumberFormatException(數(shù)字格式化異常)等等。

public class ExceptionTest {
    public static void main(String[] args) {
        int[] testArray = null;
        System.out.println(testArray[0]);  //空指針異常
    }
}
public class ExceptionTest {
    public static void main(String[] args) {
        int[] testArray = new int[3];
        System.out.println(testArray[3]);   //數(shù)組下標(biāo)越界
    }
}
public class ExceptionTest {
    public static void main(String[] args) {
        String num = "abc";
        System.out.println(Integer.parseInt(num));    //數(shù)字格式化異常
    }
}

2. throws

throws應(yīng)用在方法聲明處,指明此方法在執(zhí)行時(shí)可能會(huì)出現(xiàn)的異常類型。一旦該方法執(zhí)行時(shí)出現(xiàn)異常,就會(huì)在異常代碼處生成一個(gè)異常類的對(duì)象,此對(duì)象滿足Throws后的異常類型時(shí),就會(huì)被拋出。這里有兩個(gè)過程,代碼有異常時(shí)

1. 生成一個(gè)異常對(duì)象;

2. throws捕獲到這個(gè)異常,將異常對(duì)象拋出

throws和try-catch-finally一起稱為異常處理的兩種方式。

try-catch-finally是在出現(xiàn)異常時(shí)主動(dòng)處理掉異常,使得程序可以繼續(xù)執(zhí)行下去;而throws捕獲到異常之后向上拋出異常對(duì)象,不去真正地處理這個(gè)異常。

所謂向上拋出異常對(duì)象,是將異常對(duì)象交給調(diào)用者去處理,比如方法A調(diào)用方法B,B通過throws拋出異常,而A可以選擇使用try-catch-finally處理掉異常,也可以通過throws繼續(xù)向上拋出異常對(duì)象,直到異常被真正處理掉。如果一直沒有方法去處理異常,異常對(duì)象最終會(huì)被拋給JVM,從而導(dǎo)致程序停止運(yùn)行。

@Test
public void throwsTest(){   //調(diào)用者解決拋出的異常
    try{
        formatChange("abc");
    }
    catch (NumberFormatException e){
        System.out.println("轉(zhuǎn)換格式錯(cuò)誤!");
    }
    catch (Exception e){
        System.out.println("出現(xiàn)錯(cuò)誤");
    }
}
private int formatChange(String str) throws NumberFormatException{    //出現(xiàn)異常向上拋出
    return Integer.parseInt(str);
}

2.1 擴(kuò)展

——如何選擇try-catch-finally還是throws?

當(dāng)一個(gè)方法中存在異常需要處理,在大多數(shù)情況下,既可以選擇try-catch-finally直接處理掉這個(gè)異常,也可以選擇throws向上拋出異常,交給調(diào)用者去處理(異常拋到最后,總要有一方真正地去處理這個(gè)異常,怎么處理?還是用try-catch-finally唄),在選擇上比較自由,但是,出現(xiàn)以下兩種情況時(shí),需要遵循一定的規(guī)則(如有補(bǔ)充,敬請(qǐng)指出)。

  • 如果父類中被重寫的方法沒有使用throws拋出異常,則子類重寫的方法也不能使用throws拋出異常,也就意味著這種情況必須使用try-catch-finally去處理。
  • 在方法A中,先后調(diào)用了另外的幾種方法,這幾種方法是遞進(jìn)關(guān)系執(zhí)行的且其中很多方法都存在異常需要處理,這種情況建議被調(diào)用的幾個(gè)方法使用throws向上拋出異常,在方法A中,使用try-catch-finally統(tǒng)一處理掉這些異常。

針對(duì)第一條,這是一個(gè)規(guī)定,子類中重寫的方法使用throws拋出的異常必須不大于父類中被重寫的方法拋出異常的范圍。舉個(gè)例子,父類中的方法B拋出NullPointerException異常,則子類中重寫B(tài)方法就不能拋出如Exception這種比NullPointerException范圍更大的異常;如果父類中被重寫的方法沒有拋出任何異常,則子類更不能拋出異常。

為什么?展示一段代碼。

//假設(shè)父類中的方法B拋出NullPointerException異常,子類中的方法B可以拋出Exception
private void test(ParentClassTest parent){
    try{
        parent.B();
    }
    catch(NullPointerException e){
        System.out.println("出現(xiàn)了空指針異常");
    }
}

在本示例中,假設(shè)父類中的方法B拋出NullPointerException異常,子類中重寫的方法B可以拋出Exception。那么傳進(jìn)給test方法的參數(shù)如果是父類的實(shí)例化對(duì)象,那么調(diào)用test方法沒有任何問題。如果傳進(jìn)的參數(shù)是子類的實(shí)例化對(duì)象,再去調(diào)用子類重寫的方法B,那么就有可能拋出Exception異常,try-catch結(jié)構(gòu)就壓不住這個(gè)異常了,這顯然是一個(gè)不合理的操作。

針對(duì)第二條,假設(shè)方法A中調(diào)用了方法C、D、E,這三個(gè)方法都有可能產(chǎn)生異常,且存在遞進(jìn)關(guān)系,也就是D、E執(zhí)行需要C執(zhí)行完成、E執(zhí)行依賴C、D執(zhí)行完成。那么就推薦在C、D、E中向上拋出異常,在方法A中集中處理。為什么?如果C、D、E都是向上拋出異常,而A使用try-catch-finally去處理這個(gè)異常,如果某個(gè)方法真的出現(xiàn)異常,則不再繼續(xù)執(zhí)行。而如果C、D、E都使用try-catch-finally直接解決掉異常,那么即使產(chǎn)生了異常,方法A也不會(huì)接收到異常的產(chǎn)生,那么還會(huì)接著往下執(zhí)行,但是C出現(xiàn)了異常,再執(zhí)行D、E沒有任何意義。

3. throw

如果在程序編寫時(shí)有手動(dòng)拋出異常的需求,則可以使用throw

throw使用在方法體內(nèi)。與try-catch-finally和throws都不同,異常處理的兩個(gè)階段:1.遇到異常,生成異常對(duì)象;2.捕獲到異常,進(jìn)行拋出或處理。try-catch-finally和throws都處在第二個(gè)階段,都是捕獲到異常后的相關(guān)處理,一般使用系統(tǒng)根據(jù)異常類型自動(dòng)生成的異常對(duì)象進(jìn)行處理。而throw應(yīng)用在第一階段,手動(dòng)地產(chǎn)生一個(gè)異常對(duì)象。

舉一個(gè)例子,判斷一個(gè)數(shù)值是否為非負(fù)數(shù),如果為負(fù)數(shù),則拋出異常。

class ThrowTest{
    private int Number;
    public void judge(int num){
        if(num>=0){
            this.Number = num;
        }
        else{
            throw new RuntimeException("傳入?yún)?shù)為負(fù)數(shù)");
        }
    }
}
@Test
public void test2(){
    ThrowTest throwTest = new ThrowTest();
    throwTest.judge(-100);
}

成功拋出異常。

使用try-catch捕獲一下異常。

@Test
public void test2(){
    ThrowTest throwTest = new ThrowTest();
    try{
        throwTest.judge(-100);
    }
    catch (RuntimeException e){
        System.out.println(e.getMessage());
    }
}

如果把throw拋出的異常改為Exception,則直接報(bào)錯(cuò),也就是不能編譯。Exception包含兩種異常:編譯時(shí)異常和運(yùn)行時(shí)異常,前者在編譯前就要檢查是否有可能產(chǎn)生編譯時(shí)異常;后者是在編譯后運(yùn)行時(shí)才會(huì)判斷的異常。而throw new Exception包含了編譯時(shí)異常,需要顯式處理掉這個(gè)異常,怎么處理?try-catch-finally或者throws

class ThrowTest{
    private int Number;
    public void judge(int num) throws Exception{
        if(num>=0){
            this.Number = num;
        }
        else{
            throw new Exception("傳入?yún)?shù)為負(fù)數(shù)");
        }
    }
}

調(diào)用方也要隨著進(jìn)行更改。

@Test
public void test2(){
    ThrowTest throwTest = new ThrowTest();
    try{
        throwTest.judge(-100);
    }
    catch (RuntimeException e){
        System.out.println(e.getMessage());
    }
    catch (Exception e){
        System.out.println(e.getMessage());
    }
}

3.1 擴(kuò)展

——自定義異常類

throw還可以拋出自定義異常類。

自定義異常類的聲明需要繼承于現(xiàn)有的異常體系。

class MyException extends RuntimeException{
    static final long serialVersionUID = -703489719076939L;   //可以認(rèn)為是一種標(biāo)識(shí)
    public MyException(){}
    public MyException(String message){
        super(message);
    }
}

此時(shí)我們可以拋出自定義的異常

class ThrowTest{
    private int Number;
    public void judge(int num) throws MyException{
        if(num>=0){
            this.Number = num;
        }
        else{
            throw new MyException("不能輸入負(fù)數(shù)");
        }
    }
}

調(diào)用者修改

@Test
public void test2(){
    ThrowTest throwTest = new ThrowTest();
    try{
        throwTest.judge(-100);
    }
    catch (MyException e){
        System.out.println(e.getMessage());
    }
}

4. 總結(jié)

三者共同點(diǎn)在于都屬于是異常處理的范疇內(nèi)。

不同點(diǎn):

  • Throwable是異常處理這個(gè)分支的頂層父類,其它異常類的實(shí)現(xiàn)都需要繼承于Throwable
  • throw應(yīng)用在方法體內(nèi),是生成異常對(duì)象的一種方式
  • throws應(yīng)用在方法聲明處,聲明出可能要拋出的各種異常類,是處理異常的方式

到此這篇關(guān)于詳細(xì)介紹Java關(guān)鍵字throw throws Throwable的用法與區(qū)別的文章就介紹到這了,更多相關(guān)Java關(guān)鍵字throw throws Throwable內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis Plus 將查詢結(jié)果封裝到指定實(shí)體的方法步驟

    MyBatis Plus 將查詢結(jié)果封裝到指定實(shí)體的方法步驟

    這篇文章主要介紹了MyBatis Plus 將查詢結(jié)果封裝到指定實(shí)體的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot整合LDAP的流程分析

    SpringBoot整合LDAP的流程分析

    這篇文章主要介紹了SpringBoot整合LDAP的流程分析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • maven之packaging標(biāo)簽的使用

    maven之packaging標(biāo)簽的使用

    這篇文章主要介紹了maven之packaging標(biāo)簽的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • tk.mybatis實(shí)現(xiàn)uuid主鍵生成的示例代碼

    tk.mybatis實(shí)現(xiàn)uuid主鍵生成的示例代碼

    本文主要介紹了tk.mybatis實(shí)現(xiàn)uuid主鍵生成的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • spring boot環(huán)境抽象的實(shí)現(xiàn)方法

    spring boot環(huán)境抽象的實(shí)現(xiàn)方法

    在實(shí)際開發(fā)中,開發(fā)人員在編寫springboot的時(shí)候通常要在本地環(huán)境測(cè)試然后再部署到Production環(huán)境,這兩種環(huán)境一般來講是不同的,最主要的區(qū)別就是數(shù)據(jù)源的不同。本文主要介紹了這兩種,感興趣的可以了解一下
    2019-04-04
  • Java解析xml文件遇到特殊符號(hào)異常的情況(處理方案)

    Java解析xml文件遇到特殊符號(hào)異常的情況(處理方案)

    這篇文章主要介紹了Java解析xml文件遇到特殊符號(hào)&會(huì)出現(xiàn)異常的解決方案,實(shí)現(xiàn)思路很簡單通過在讀取xml文件使用SAX解析前讀取reader,具體實(shí)現(xiàn)方法及示例代碼跟隨小編一起看看吧
    2021-05-05
  • 異常點(diǎn)/離群點(diǎn)檢測(cè)算法——LOF解析

    異常點(diǎn)/離群點(diǎn)檢測(cè)算法——LOF解析

    這篇文章主要介紹了異常點(diǎn)/離群點(diǎn)檢測(cè)算法——LOF解析,通過圖解文字描述的方式詳細(xì)的解析了該算法,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Spring Boot下如何自定義Repository中的DAO方法

    Spring Boot下如何自定義Repository中的DAO方法

    這篇文章主要介紹了Spring Boot下如何自定義Repository中的DAO方法,需要的朋友可以參考下
    2017-06-06
  • Java數(shù)據(jù)結(jié)構(gòu)之順序表和鏈表精解

    Java數(shù)據(jù)結(jié)構(gòu)之順序表和鏈表精解

    我在學(xué)習(xí)完順序表后一直對(duì)順序表和鏈表的概念存在一些疑問,這里給出一些分析和看法,通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java實(shí)現(xiàn)插入排序

    Java實(shí)現(xiàn)插入排序

    這篇文章主要介紹了Java實(shí)現(xiàn)插入排序,把一列數(shù)組按從小到大或從大到小排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論