真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

effectivejava第三版推薦使用try-with-resources代替try-finally的原因是什么

本篇內(nèi)容主要講解“effective java第三版推薦使用try-with-resources代替try-finally的原因是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“effective java第三版推薦使用try-with-resources代替try-finally的原因是什么”吧!

勐海ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

背景

try-finally 這個(gè)語(yǔ)句想必做java的同學(xué)都不陌生吧,每當(dāng)我們有關(guān)閉資源的需求我們都會(huì)使用到try-finally這個(gè)語(yǔ)句,比如我們?cè)谑褂面i的時(shí)候,無(wú)論是本地的可重入鎖還是分布式鎖都會(huì)有下面類似的結(jié)構(gòu)代碼,我們會(huì)在finally里面進(jìn)行unlock,用于強(qiáng)制解鎖:

    Lock lock = new ReentrantLock();
    lock.lock();
    try{
        // doSometing
    }finally {
        lock.unlock();
    }

或者我們使用java的文件流讀取或者寫入文件的時(shí)候,我們也會(huì)在finally中強(qiáng)制關(guān)閉文件流,防止資源泄漏。

    InputStream inputStream = new FileInputStream("file");
    try {
        System.out.println(inputStream.read(new byte[4]));
    }finally {
        inputStream.close();
    }

其實(shí)乍一看 這樣的寫法應(yīng)該沒什么問題,但是如果我們出現(xiàn)了多個(gè)資源需要關(guān)閉我們應(yīng)該怎么寫呢?最常見的寫法如下:

InputStream inputStream = new FileInputStream("file");
    OutputStream outStream = new FileOutputStream("file1");

    try {
        System.out.println(inputStream.read(new byte[4]));
        outStream.write(new byte[4]);
    }finally {
        inputStream.close();
        outStream.close();
    }

我們?cè)谕饷娑x了兩個(gè)資源,然后在finally里面依次對(duì)這兩個(gè)資源進(jìn)行關(guān)閉,這個(gè)寫法在我最開始寫java的時(shí)候?qū)ξ募骱蛿?shù)據(jù)庫(kù)連接池做close的時(shí)候一些教學(xué)的文章都是這么教學(xué)的,那么這個(gè)哪里有問題呢?問題其實(shí)在于如果在inputStream.close的時(shí)候拋出異常,那么outStream.close()就不會(huì)執(zhí)行,這很明顯不是我們想要的結(jié)果,所以后面就改成了下面這種多重嵌套的方式去寫:

    InputStream inputStream = new FileInputStream("file");
    try {
        System.out.println(inputStream.read(new byte[4]));
        try{
            OutputStream outStream = new FileOutputStream("file1");
            outStream.write(new byte[4]);
        }finally {
            outStream.close();
        }
    }finally {
        inputStream.close();
    }

在這種方式中即便是outStream.close()拋出了異常,但是我們依然會(huì)執(zhí)行到inputStream.close(),因?yàn)樗麄兪窃诓煌膄inally塊,這個(gè)的確解決了我們的問題,但是還有兩個(gè)問題沒有解決:

  • 帶來(lái)的第一個(gè)問題就是如果我們有不止兩個(gè)資源,比如有十個(gè)資源,難道需要讓我們寫十個(gè)嵌套的語(yǔ)句嗎?寫完之后這個(gè)代碼還能看嗎?

  • 第二個(gè)問題就是如果我們?cè)趖ry里面出現(xiàn)異常,然后在finally里面又出現(xiàn)異常,就會(huì)導(dǎo)致異常覆蓋,會(huì)導(dǎo)致finally里面的異常將try的異常覆蓋了。

public class CloseTest {

    public void close(){
        throw new RuntimeException("close");
    }

    public static void main(String[] args) {
        CloseTest closeTest = new CloseTest();
        try{
            throw new RuntimeException("doSomething");
        }finally {
            closeTest.close();
        }
    }

}
輸出結(jié)果:Exception in thread "main" java.lang.RuntimeException: close

上面這個(gè)代碼,我們期望的是能拋出doSomething的這個(gè)異常,但是實(shí)際的數(shù)據(jù)結(jié)果卻是close的異常,這和我們的預(yù)期不符合。

try-with-resources

上面我們介紹了兩個(gè)問題,于是在java7中引入了try-with-resources的語(yǔ)句,只要我們的資源實(shí)現(xiàn)了AutoCloseable這個(gè)接口那么我們就可以使用這個(gè)語(yǔ)句了,我們之前的文件流已經(jīng)實(shí)現(xiàn)了這個(gè)接口那么我們可以直接使用:

try(InputStream inputStream = new FileInputStream("file");
            OutputStream outStream = new FileOutputStream("file1")) {
            System.out.println(inputStream.read(new byte[4]));
            outStream.write(new byte[4]);
        }

我們所有的資源定義全部都在try后面的括號(hào)中進(jìn)行定義,通過這種方式我們就可以解決上面所說的幾個(gè)問題:

  • 首先第一個(gè)問題,我們通過這樣的方式,代碼非常整潔,無(wú)論你有多少個(gè)資源,都可以很簡(jiǎn)潔的去做。

  • 第二個(gè)異常覆蓋問題的話,我們可以通過實(shí)驗(yàn)來(lái)看一下,我們將代碼改寫為如下:

public class CloseTest implements AutoCloseable {

    @Override
    public void close(){
        System.out.println("close");
        throw new RuntimeException("close");
    }

    public static void main(String[] args) {
        try(CloseTest closeTest = new CloseTest();
            CloseTest closeTest1 = new CloseTest();){
            throw new RuntimeException("Something");
        }
    }

}
輸出結(jié)果為:
close
close
Exception in thread "main" java.lang.RuntimeException: Something
	at fudao.CloseTest.main(CloseTest.java:33)
	Suppressed: java.lang.RuntimeException: close
		at fudao.CloseTest.close(CloseTest.java:26)
		at fudao.CloseTest.main(CloseTest.java:34)
	Suppressed: java.lang.RuntimeException: close
		at fudao.CloseTest.close(CloseTest.java:26)
		at fudao.CloseTest.main(CloseTest.java:34)

我們?cè)诖a中定義了兩個(gè)CloseTest,用來(lái)驗(yàn)證之前close出現(xiàn)異常是否會(huì)影響第二個(gè),同時(shí)在close和try塊里面都拋出不同的異常,可以看見我們的結(jié)果,輸出了兩個(gè)close,證明雖然close拋出異常,但是兩個(gè)close都會(huì)執(zhí)行。然后輸出了doSomething的異常,可以發(fā)現(xiàn)這里我們輸出的就是我們try塊里面所拋出的異常,并且我們close的異常以Suppressed的方式記錄在異常的堆棧里面,通過這樣的方式我們兩種異常都能記錄下來(lái)。

try-with-resources原理

try-with-resources語(yǔ)句其實(shí)是一種語(yǔ)法糖,通過編譯之后又回到了我們開始說的嵌套的那種模式: effective java第三版推薦使用try-with-resources代替try-finally的原因是什么

可以發(fā)現(xiàn)try-with-resources被編譯之后,又采取了嵌套的模式,但是和之前的嵌套有點(diǎn)不同,他close的時(shí)候都利用了catch去捕獲了異常,然后添加到我們真正的異常中,整體邏輯比我們之前的嵌套要復(fù)雜一些。

到此,相信大家對(duì)“effective java第三版推薦使用try-with-resources代替try-finally的原因是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


本文題目:effectivejava第三版推薦使用try-with-resources代替try-finally的原因是什么
URL網(wǎng)址:http://weahome.cn/article/jdocdh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部