成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么不推薦使用try-catch-finally處理Java異常?

開發 后端
這篇文章是我近期看了《Effective java》一書中總結的,來自其中第九條。為了對其理解的更加透徹,因此重新分析了一下,并加入了一些其他點。

 這篇文章是我近期看了《Effective java》一書中總結的,來自其中第九條。為了對其理解的更加透徹,因此重新分析了一下,并加入了一些其他點。

    “    本文的所有例子均在本地代碼運行完畢

         基于JDK版本1.8,運行環境eclipse

         本文類名:TryWithResources,下文的堆棧信息也以此為基礎    ”

在java開發中,一些網絡鏈接或者是文件資源都需要程序員去手動調用close方法關閉,比如InputStream、OutputStream和java.sql.Connection。如果忘關了就可能造成嚴重的性能后果。而關閉的方法有很多種。比如finalizer、try-catch-finally、try-with-resources等等。

finalizer機制可以關閉,但是其執行性不可預測,還有可能造成內存泄漏,所以一般不使用,雖然java9還提出了cleaner機制代替了finalizer機制,但是其執行依然不可預測,因此選擇就落在了try-catch-finally和try-with-resources之間。

本文就是為了討論該選擇哪一種比較好,不過題目已經給出了答案肯定是try-with-resources。下面帶著這個答案去分析為什么推薦使用try-with-resources而不是try-finally。

一、前言

在正式分析之前,我們先看一波finally的執行順序。

1、finally不是必要條件

也就是說try-catch-finally中,可以只有try-catch,也可以只有try-finally。

2、假設基于try-catch-finally:

第一:代碼沒有異常

執行順序:try執行完整->catch不執行->finally執行

第二:代碼有異常且catch進行捕獲

執行順序:try執行部分->跳轉catch捕獲處理->finally執行

第三:代碼有異常且catch不捕獲:這種情況沒有catch

執行順序:try執行部分->finally執行

從上面的執行順序可以看出,finally語句不管在哪種情況是一定會執行的。基于這個認識,現在我們再來分析。

二、try-finally的缺點

先看案例,本案例來自《Effective java》,現在要關閉資源: 

  1. static String firstLineOfFile(String path) throws IOException {  
  2.         BufferedReader reader = new BufferedReader(new FileReader(path));  
  3.         try {  
  4.             return reader.readLine();  
  5.         } finally {  
  6.             reader.close();  
  7.         }  

關閉一個資源還好,但是如果再添加第二個資源,代碼看起來就會一團糟了。 

  1. static void copy(String src, String desc) throws IOException {  
  2.         InputStream in = new FileInputStream(src);  
  3.         try {  
  4.             OutputStream out = new FileOutputStream(desc);  
  5.             byte[] bytes = new byte[1024];  
  6.             int n;  
  7.             try {  
  8.                 while ((n = in.read(bytes)) != -1) {  
  9.                     out.write(bytes, 0, n);  
  10.                 }  
  11.             } finally {  
  12.                 out.close(); 
  13.             }  
  14.         } finally {  
  15.             in.close();  
  16.         }  

如果需要關閉的資源不僅種類多,而且數量也很多。那代碼可就太龐大了。現在對這種方式的缺點進行一波總結:

1. 關閉的資源多事,代碼復雜

2. 對于第一個案例,如果設備出現異常,那么那么調用readLine就會拋出異常,同時close方法也出現異常,在這種情況下,close異常會完全抹去readLine異常。在異常堆棧軌跡中也完全沒有readLine異常的記錄。

現在來測試一邊:

基于以上原因,出現了try-with-resources。

三、try-with-resources的優勢

try-with-resources是在jdk1.7引入的,可以完美解決以上的問題。要使用這個構造的資源,必須先實現AutoCloseable接口,其中包含了單個返回void的close方法,Java類庫與第三方類庫中的許多類和接口,現在都實現或擴展了AutoCloseable接口,因此我們現在不必實現了。

既然try-with-resources能夠解決以上的問題,現在來看一下,如何解決的:

1、代碼復雜問題解決 

  1. static void copy(String src, String desc) throws IOException {  
  2.         try (InputStream in = new FileInputStream(src);  
  3.              OutputStream out = new FileOutputStream(desc)) {  
  4.             byte[] bytes = new byte[1024];  
  5.             int n;  
  6.             while ((n = in.read(bytes)) != -1) {  
  7.                 out.write(bytes, 0, n);  
  8.             }  
  9.         }  

可以看出這種方式代碼更加簡單,出現了錯誤,也能快速定位。

2、異常抹去問題解決 

  1. static String firstLineOfFil  (String path) throws IOException {  
  2.         try (BufferedReader reader = new BufferedReader(new FileReader(path))) {  
  3.             return reader.readLine();  
  4.         } 
  5.  

如果readLine和不可見的close方法都拋出異常,close方法拋出的異常就會被禁止,try-finally處理機制中我們無法看到,堆棧軌跡中也不能打印,但是try-with-resources不一樣,全部會被打印在堆棧軌跡中,并注明它們是被禁止的異常,通過編寫調用getSuppressed方法還可以訪問到它們。現在再來測試一遍。

OK,上面基本上全部分析完畢,但是此書還給出了一個更好的案例: 

  1. static String firstLineOfFile(String path, String defaultVal) {  
  2.         try (BufferedReader reader = new BufferedReader(new FileReader(path))) {  
  3.             return reader.readLine();  
  4.         } catch (IOException e) {  
  5.             return defaultVal; 
  6.          }  

這個firstLineOfFile方法沒有拋出異常,但是如果它無法打開文件,或者無法從中讀取,就會返回一個默認值。

結論

處理必須關閉的資源時,始終要優先考慮使用try-with-resources,而不是try-finally。這樣得到的代碼將更簡潔,清晰,產生的異常也更有價值,這些也是try-finally無法做到的。 

責任編輯:龐桂玉 來源: java版web項目
相關推薦

2024-05-10 11:43:23

C#編程

2021-03-31 11:52:24

try-catch-fJava代碼

2024-09-24 08:18:13

2023-11-13 17:01:26

C++編程

2009-07-21 14:30:38

Scalatry-catch

2021-01-28 08:03:44

程序員 finallyreturn

2024-11-04 08:20:00

try-catch編程

2024-11-29 08:20:22

Autowired場景項目

2024-06-04 00:10:00

開發拷貝

2024-11-12 10:30:54

Docker部署數據庫

2020-08-24 13:35:59

trycatchJava

2020-06-28 09:08:08

Java語法塊開發

2024-09-12 08:32:42

2025-05-16 02:00:00

HashMapJava代碼

2025-04-08 07:30:00

前端開發JavaScript

2025-02-12 12:00:00

前端try-catchJavaScrip

2021-08-23 13:02:50

MySQLJOIN數據庫

2023-11-06 13:04:59

Python日志庫

2022-01-11 10:29:32

Docker文件掛載

2019-10-28 09:53:42

Java開發結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人久久 | 国产偷录视频叫床高潮对白 | 日本不卡一区二区三区在线观看 | 暴草美女 | 成人免费大片黄在线播放 | 国偷自产av一区二区三区 | 亚洲欧美日韩激情 | 中文字幕观看 | 久久国产精品免费 | 精品欧美一区二区精品久久久 | 91在线视频免费观看 | 国久久 | 乳色吐息在线观看 | 久久久久久国产 | 天堂一区二区三区 | 久久久成人免费视频 | 亚洲精品66 | 久久99精品久久久久久噜噜 | 天天射夜夜操 | 国产精久久久久久 | 日韩欧美在线免费观看 | 亚洲影视在线 | 亚洲综合一区二区三区 | av一区二区三区 | 91精品国产色综合久久 | 伦理片97| 免费高潮视频95在线观看网站 | 国产午夜精品一区二区三区嫩草 | 国产精品美女一区二区 | 久久激情视频 | 免费在线播放黄色 | 中文字幕日本一区二区 | 99精品免费久久久久久日本 | 国产精品久久久久一区二区 | 成人综合视频在线 | 成人av网站在线观看 | 精品久久香蕉国产线看观看亚洲 | 国产精品免费一区二区三区四区 | 午夜精品一区二区三区在线视频 | 欧美一区精品 | 欧洲色综合 |