欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

java異常處理方法是什么

這篇文章主要介紹“java異常處理方法是什么”,在日常操作中,相信很多人在java異常處理方法是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”java異常處理方法是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

晉州網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)

異常簡(jiǎn)介

先上個(gè)圖,看一下常見(jiàn)的幾個(gè)異常類(lèi)型。

java異常處理方法是什么

所有的異常都來(lái)自于Throwable。Throwable有兩個(gè)子類(lèi),Error和Exception。

Error通常表示的是嚴(yán)重錯(cuò)誤,這些錯(cuò)誤是不建議被catch的。

注意這里有一個(gè)例外,比如ThreadDeath也是繼承自Error,但是它表示的是線程的死亡,雖然不是嚴(yán)重的異常,但是因?yàn)閼?yīng)用程序通常不會(huì)對(duì)這種異常進(jìn)行catch,所以也歸類(lèi)到Error中。

Exception表示的是應(yīng)用程序希望catch住的異常。

在Exception中有一個(gè)很特別的異常叫做RuntimeException。RuntimeException叫做運(yùn)行時(shí)異常,是不需要被顯示catch住的,所以也叫做unchecked Exception。而其他非RuntimeException的Exception則需要顯示try catch,所以也叫做checked Exception。

不要忽略checked exceptions

我們知道checked exceptions是一定要被捕獲的異常,我們?cè)诓东@異常之后通常有兩種處理方式。

第一種就是按照業(yè)務(wù)邏輯處理異常,第二種就是本身并不處理異常,但是將異常再次拋出,由上層代碼來(lái)處理。

如果捕獲了,但是不處理,那么就是忽略checked exceptions。

接下來(lái)我們來(lái)考慮一下java中線程的中斷異常。

java中有三個(gè)非常相似的方法interrupt,interrupted和isInterrupted。

isInterrupted()只會(huì)判斷是否被中斷,而不會(huì)清除中斷狀態(tài)。

interrupted()是一個(gè)類(lèi)方法,調(diào)用isInterrupted(true)判斷的是當(dāng)前線程是否被中斷。并且會(huì)清除中斷狀態(tài)。

前面兩個(gè)是判斷是否中斷的方法,而interrupt()就是真正觸發(fā)中斷的方法。

它的工作要點(diǎn)有下面4點(diǎn):

  1. 如果當(dāng)前線程實(shí)例在調(diào)用Object類(lèi)的wait(),wait(long)或wait(long,int)方法或join(),join(long),join(long,int)方法,或者在該實(shí)例中調(diào)用了Thread.sleep(long)或Thread.sleep(long,int)方法,并且正在阻塞狀態(tài)中時(shí),則其中斷狀態(tài)將被清除,并將收到InterruptedException。

  2. 如果此線程在InterruptibleChannel上的I / O操作中處于被阻塞狀態(tài),則該channel將被關(guān)閉,該線程的中斷狀態(tài)將被設(shè)置為true,并且該線程將收到j(luò)ava.nio.channels.ClosedByInterruptException異常。

  3. 如果此線程在java.nio.channels.Selector中處于被被阻塞狀態(tài),則將設(shè)置該線程的中斷狀態(tài)為true,并且它將立即從select操作中返回。

  4. 如果上面的情況都不成立,則設(shè)置中斷狀態(tài)為true。

看下面的例子:

public void wrongInterrupted(){
        try{
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

上面代碼中我們捕獲了一個(gè)InterruptedException,但是我們僅僅是打印出了異常信息,并沒(méi)有做任何操作。這樣程序的表現(xiàn)和沒(méi)有發(fā)送一異常一樣,很明顯是有問(wèn)題的。

根據(jù)上面的介紹,我們知道,interrupted()方法會(huì)清除中斷狀態(tài),所以,如果我們自身處理不了異常的情況下,需要重新調(diào)用Thread.currentThread().interrupt()重新拋出中斷,由上層代碼負(fù)責(zé)處理,如下所示。

public void correctInterrupted(){
        try{
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }

不要在異常中暴露敏感信息

遇到異常的時(shí)候,通常我們需要進(jìn)行一定程度的日志輸出,從而來(lái)定位異常。但是我們?cè)谧鋈罩据敵龅臅r(shí)候,一定要注意不要暴露敏感信息。

下表可以看到異常信息可能會(huì)暴露的敏感信息:

java異常處理方法是什么

除了敏感信息之外,我們還要做好日志信息的安全保護(hù)。

在處理捕獲的異常時(shí),需要恢復(fù)對(duì)象的初始狀態(tài)

如果我們?cè)谔幚懋惓5臅r(shí)候,修改了對(duì)象中某些字段的狀態(tài),在捕獲異常的時(shí)候需要怎么處理呢?

private int age=30;

    public void wrongRestore(){
        try{
            age=20;
            throw new IllegalStateException("custom exception!");
        }catch (IllegalStateException e){
            System.out.println("we do nothing");
        }
    }

上面的例子中,我們將age重置為20,然后拋出了異常。雖然拋出了異常,但是我們并沒(méi)有重置age,最后導(dǎo)致age最終被修改了。

整個(gè)restore的邏輯沒(méi)有處理完畢,但是我們部分修改了對(duì)象的數(shù)據(jù),這是很危險(xiǎn)的。

實(shí)際上,我們需要一個(gè)重置:

public void rightRestore(){
        try{
            age=20;
            throw new IllegalStateException("custom exception!");
        }catch (IllegalStateException e){
            System.out.println("we do nothing");
            age=30;
        }
    }

不要手動(dòng)完成finally block

我們?cè)谑褂胻ry-finally和try-catch-finally語(yǔ)句時(shí),一定不要在finally block中使用return, break, continue或者throw語(yǔ)句。

為什么呢?

根據(jù)Java Language Specification(JLS)的說(shuō)明,finally block一定會(huì)被執(zhí)行,不管try語(yǔ)句中是否拋出異常。

在try-finally和try-catch-finally語(yǔ)句中,如果try語(yǔ)句中拋出了異常R,然后finally block被執(zhí)行,這時(shí)候有兩種情況:

  • 如果finally block正常執(zhí)行,那么try語(yǔ)句被終止的原因是異常R。

  • 如果在finally block中拋出了異常S,那么try語(yǔ)句被終止的原因?qū)?huì)變成S。

我們舉個(gè)例子:

public class FinallyUsage {

    public boolean wrongFinally(){
        try{
            throw new IllegalStateException("my exception!");
        }finally {
            System.out.println("Code comes to here!");
            return true;
        }
    }

    public boolean rightFinally(){
        try{
            throw new IllegalStateException("my exception!");
        }finally {
            System.out.println("Code comes to here!");
        }
    }

    public static void main(String[] args) {
        FinallyUsage finallyUsage=new FinallyUsage();
        finallyUsage.wrongFinally();
        finallyUsage.rightFinally();
    }
}

上面的例子中,我們定義了兩個(gè)方法,一個(gè)方法中我們?cè)趂inally中直接return,另一方法中,我們讓finally正常執(zhí)行完畢。

最終,我們可以看到wrongFinally將異常隱藏了,而rightFinally保留了try的異常。

同樣的,如果我們?cè)趂inally block中拋出了異常,我們一定要記得對(duì)其進(jìn)行捕獲,否則將會(huì)隱藏try block中的異常信息。

不要捕獲NullPointerException和它的父類(lèi)異常

通常來(lái)說(shuō)NullPointerException表示程序代碼有邏輯錯(cuò)誤,是需要程序員來(lái)進(jìn)行代碼邏輯修改,從而進(jìn)行修復(fù)的。

比如說(shuō)加上一個(gè)null check。

不捕獲NullPointerException的原因有三個(gè)。

  1. 使用null check的開(kāi)銷(xiāo)要遠(yuǎn)遠(yuǎn)小于異常捕獲的開(kāi)銷(xiāo)。

  2. 如果在try block中有多個(gè)可能拋出NullPointerException的語(yǔ)句,我們很難定位到具體的錯(cuò)誤語(yǔ)句。

  3. 最后,如果發(fā)生了NullPointerException,程序基本上不可能正常運(yùn)行或者恢復(fù),所以我們需要提前進(jìn)行null check的判斷。

同樣的,程序也不要對(duì)NullPointerException的父類(lèi)RuntimeException, Exception, or Throwable進(jìn)行捕捉。

不要throw RuntimeException, Exception, or Throwable

我們拋出異常主要是為了能夠找到準(zhǔn)確的處理異常的方法,如果直接拋出RuntimeException, Exception, 或者 Throwable就會(huì)導(dǎo)致程序無(wú)法準(zhǔn)確處理特定的異常。

通常來(lái)說(shuō)我們需要自定義RuntimeException, Exception, 或者 Throwable的子類(lèi),通過(guò)具體的子類(lèi)來(lái)區(qū)分具體的異常類(lèi)型。

不要拋出未聲明的checked Exception

一般來(lái)說(shuō)checked Exception是需要顯示catch住,或者在調(diào)用方法上使用throws做申明的。

但是我們可以通過(guò)某些手段來(lái)繞過(guò)這種限制,從而在使用checked Exception的時(shí)候不需要遵守上述規(guī)則。

當(dāng)然這樣做是需要避免的。我們看一個(gè)例子:

private static Throwable throwable;

    private ThrowException() throws Throwable {
        throw throwable;
    }

    public static synchronized void undeclaredThrow(Throwable throwable) {

        ThrowException.throwable = throwable;
        try {
                ThrowException.class.newInstance();
            } catch (InstantiationException e) {
            } catch (IllegalAccessException e) {
        } finally {
            ThrowException.throwable = null;
        }
    }

上面的例子中,我們定義了一個(gè)ThrowException的private構(gòu)造函數(shù),這個(gè)構(gòu)造函數(shù)會(huì)throw一個(gè)throwable,這個(gè)throwable是從方法傳入的。

在undeclaredThrow方法中,我們調(diào)用了ThrowException.class.newInstance()實(shí)例化一個(gè)ThrowException實(shí)例,因?yàn)樾枰{(diào)用構(gòu)造函數(shù),所以會(huì)拋出傳入的throwable。

因?yàn)镋xception是throwable的子類(lèi),如果我們?cè)谡{(diào)用的時(shí)候傳入一個(gè)checked Exception,很明顯,我們的代碼并沒(méi)有對(duì)其進(jìn)行捕獲:

public static void main(String[] args) {
        ThrowException.undeclaredThrow(
                new Exception("Any checked exception"));
    }

怎么解決這個(gè)問(wèn)題呢?換個(gè)思路,我們可以使用Constructor.newInstance()來(lái)替代class.newInstance()。

try {
        Constructor constructor =
                    ThrowException.class.getConstructor(new Class<?>[0]);
            constructor.newInstance();
        } catch (InstantiationException e) {
        } catch (InvocationTargetException e) {
            System.out.println("catch exception!");
        } catch (NoSuchMethodException e) {
        } catch (IllegalAccessException e) {
        } finally {
            ThrowException.throwable = null;
        }

上面的例子,我們使用Constructor的newInstance方法來(lái)創(chuàng)建對(duì)象的實(shí)例。和class.newInstance不同的是,這個(gè)方法會(huì)拋出InvocationTargetException異常,并且把所有的異常都封裝進(jìn)去。

所以,這次我們獲得了一個(gè)checked Exception。

到此,關(guān)于“java異常處理方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

分享名稱(chēng):java異常處理方法是什么
本文網(wǎng)址:http://aaarwkj.com/article48/iihsep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、靜態(tài)網(wǎng)站、做網(wǎng)站營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站建設(shè)網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
国产精品欧美日韩一区| 国产亚洲欧美另类网爆| 国产精品一区二区久久| 免费国产网站在线观看不卡| 欧美伊香蕉久久综合网99| 男人av天堂手机在线| 国产三级黄色片免费看| 青青草原在线免费视频| 亚洲国产欧美日韩一区| 亚洲激情av在线观看| 日韩欧美国产精品一区二区三区 | dy888午夜福利精品国产97| 欧美日韩在线一区2区| 日韩免费av在线观看| 国产欧美日韩一级二级三级| 欧美一区二区三区日韩精品| 日韩视频精品推荐一区二区| 香蕉伊蕉伊中文在线视频| 91精品国产自产永久在线| 亚洲欧美国产日韩天堂区| 亚洲av精二区三区四区| 亚洲天堂av福利在线观看| 亚洲欧美日韩国产一区| 国产一区二区三区在线精品专区| 人妻日韩精品综合一二三四| 91亚洲蜜桃内射后入在线观看| 人妻久久一区二区三区精品99 | 国产精品久久99真精品| 婷婷色综合一区二区三区| 三级精品一区二区三区| 国产福利91精品一区二区三| 视频一二区免费在线观看| 98热这里只有精品视频| 久草福利视频免费播放| 成人欧美黑人一区二区| 亚洲精品熟女国产中文| 亚洲中文字幕在线乱码| 亚洲日本欧洲二区精品| 久久久久久精品人妻网| 日韩精品a区二区在线电影| 国产成人av三级在线观看|