本篇內(nèi)容主要講解“為什么不使用try-catch-finally處理Java異常”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“為什么不使用try-catch-finally處理Java異常”吧!
創(chuàng)新互聯(lián)主打移動(dòng)網(wǎng)站、網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護(hù)、國(guó)際域名空間、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實(shí)力的保障下,我們?yōu)榭蛻?hù)承諾穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再?zèng)Q定采用什么樣的設(shè)計(jì)。最后,要實(shí)現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計(jì),我們還會(huì)規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。
一、前言
在正式分析之前,我們先看一波finally的執(zhí)行順序。
1、finally不是必要條件
也就是說(shuō)try-catch-finally中,可以只有try-catch,也可以只有try-finally。
2、假設(shè)基于try-catch-finally:
第一:代碼沒(méi)有異常
執(zhí)行順序:try執(zhí)行完整->catch不執(zhí)行->finally執(zhí)行
第二:代碼有異常且catch進(jìn)行捕獲
執(zhí)行順序:try執(zhí)行部分->跳轉(zhuǎn)catch捕獲處理->finally執(zhí)行
第三:代碼有異常且catch不捕獲:這種情況沒(méi)有catch
執(zhí)行順序:try執(zhí)行部分->finally執(zhí)行
從上面的執(zhí)行順序可以看出,finally語(yǔ)句不管在哪種情況是一定會(huì)執(zhí)行的。基于這個(gè)認(rèn)識(shí),現(xiàn)在我們?cè)賮?lái)分析。
二、try-finally的缺點(diǎn)
先看案例,本案例來(lái)自《Effective java》,現(xiàn)在要關(guān)閉資源:
static String firstLineOfFile(String path) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(path)); try { return reader.readLine(); } finally { reader.close(); } }關(guān)閉一個(gè)資源還好,但是如果再添加第二個(gè)資源,代碼看起來(lái)就會(huì)一團(tuán)糟了。
static void copy(String src, String desc) throws IOException { InputStream in = new FileInputStream(src); try { OutputStream out = new FileOutputStream(desc); byte[] bytes = new byte[1024]; int n; try { while ((n = in.read(bytes)) != -1) { out.write(bytes, 0, n); } } finally { out.close(); } } finally { in.close(); } }如果需要關(guān)閉的資源不僅種類(lèi)多,而且數(shù)量也很多。那代碼可就太龐大了。現(xiàn)在對(duì)這種方式的缺點(diǎn)進(jìn)行一波總結(jié):
1. 關(guān)閉的資源多事,代碼復(fù)雜
2. 對(duì)于第一個(gè)案例,如果設(shè)備出現(xiàn)異常,那么那么調(diào)用readLine就會(huì)拋出異常,同時(shí)close方法也出現(xiàn)異常,在這種情況下,close異常會(huì)完全抹去readLine異常。在異常堆棧軌跡中也完全沒(méi)有readLine異常的記錄。
現(xiàn)在來(lái)測(cè)試一邊:

基于以上原因,出現(xiàn)了try-with-resources。
三、try-with-resources的優(yōu)勢(shì)
try-with-resources是在jdk1.7引入的,可以完美解決以上的問(wèn)題。要使用這個(gè)構(gòu)造的資源,必須先實(shí)現(xiàn)AutoCloseable接口,其中包含了單個(gè)返回void的close方法,Java類(lèi)庫(kù)與第三方類(lèi)庫(kù)中的許多類(lèi)和接口,現(xiàn)在都實(shí)現(xiàn)或擴(kuò)展了AutoCloseable接口,因此我們現(xiàn)在不必實(shí)現(xiàn)了。
既然try-with-resources能夠解決以上的問(wèn)題,現(xiàn)在來(lái)看一下,如何解決的:
1、代碼復(fù)雜問(wèn)題解決
static void copy(String src, String desc) throws IOException { try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(desc)) { byte[] bytes = new byte[1024]; int n; while ((n = in.read(bytes)) != -1) { out.write(bytes, 0, n); } } }可以看出這種方式代碼更加簡(jiǎn)單,出現(xiàn)了錯(cuò)誤,也能快速定位。
2、異常抹去問(wèn)題解決
static String firstLineOfFil (String path) throws IOException { try (BufferedReader reader = new BufferedReader(new FileReader(path))) { return reader.readLine(); } }如果readLine和不可見(jiàn)的close方法都拋出異常,close方法拋出的異常就會(huì)被禁止,try-finally處理機(jī)制中我們無(wú)法看到,堆棧軌跡中也不能打印,但是try-with-resources不一樣,全部會(huì)被打印在堆棧軌跡中,并注明它們是被禁止的異常,通過(guò)編寫(xiě)調(diào)用getSuppressed方法還可以訪(fǎng)問(wèn)到它們。現(xiàn)在再來(lái)測(cè)試一遍。

OK,上面基本上全部分析完畢,但是此書(shū)還給出了一個(gè)更好的案例:
static String firstLineOfFile(String path, String defaultVal) { try (BufferedReader reader = new BufferedReader(new FileReader(path))) { return reader.readLine(); } catch (IOException e) { return defaultVal; } }這個(gè)firstLineOfFile方法沒(méi)有拋出異常,但是如果它無(wú)法打開(kāi)文件,或者無(wú)法從中讀取,就會(huì)返回一個(gè)默認(rèn)值。
到此,相信大家對(duì)“為什么不使用try-catch-finally處理Java異常”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
當(dāng)前題目:為什么不使用try-catch-finally處理Java異常
網(wǎng)站網(wǎng)址:http://chinadenli.net/article18/gghidp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、定制網(wǎng)站、靜態(tài)網(wǎng)站、搜索引擎優(yōu)化、標(biāo)簽優(yōu)化、動(dòng)態(tài)網(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)