1. 程式人生 > 實用技巧 >try語法糖

try語法糖

背景

臨時接到一個查詢資料庫資料並生成txt檔案,並打包zip上傳到ftp的功能。
程式碼自然不算特別複雜,但是發現我們專案使用了1.7的jdk後,瞬間來了興趣,以前一直想用沒敢用的要拿上來試試看了。

簡略程式碼如下

普通寫法自然是類似這樣

 1 private static void generateData(DateTime time, String dataPath) {
 2         Connection connection = (Connection)DBUtil.getConnection(DataBaseType.MySql, Constant.MYSQL_URL, Constant.MYSQL_USERNAME, Constant.MYSQL_PWD);
3 try { 4 ///查詢語句 5 6 /// 寫入檔案 7 8 } catch (Exception e) { 9 10 }finally{ 11 IOUtils.closeQuiet(connection); 12 } 13 }

jdk提供的語法糖,類似C#的with關鍵字,寫出程式碼如下:

 1 private static void generateData(DateTime time, String dataPath) {
2 try (Connection connection = (Connection) DBUtil.getConnection(DataBaseType.MySql, Constant.MYSQL_URL, 3 Constant.MYSQL_USERNAME, Constant.MYSQL_PWD)) { 4 ///查詢語句 5 6 /// 寫入檔案 7 8 } catch (Exception e) { 9 10 } 11 }

可以看到,這裡沒有寫finally,那麼生效的語句是什麼樣子呢,我們用jad反編譯下生成的class

 1 private static void generateData(DateTime time, String dataPath)
 2     {
 3         Connection connection;
 4         Throwable throwable;
 5         connection = (Connection)DBUtil.getConnection(DataBaseType.MySql, Constant.MYSQL_URL, Constant.MYSQL_USERNAME, Constant.MYSQL_PWD);
 6         throwable = null;
 7         try
 8         {
 9                ///查詢語句
10 
11                /// 寫入檔案
12 
13         }
14         catch(Throwable throwable1)
15         {
16             throwable = throwable1;
17             throw throwable1;
18         }
19         if(connection != null)
20             if(throwable != null)
21                 try
22                 {
23                     connection.close();
24                 }
25                 catch(Throwable x2)
26                 {
27                     throwable.addSuppressed(x2);
28                 }
29             else
30                 connection.close();
31         break MISSING_BLOCK_LABEL_486;
32         Exception exception;
33         exception;
34         if(connection != null)
35             if(throwable != null)
36                 try
37                 {
38                     connection.close();
39                 }
40                 catch(Throwable x2)
41                 {
42                     throwable.addSuppressed(x2);
43                 }
44             else
45                 connection.close();
46         throw exception;
47         Exception e;
48         e;
49     }

jdk編譯的時候已經很聰明地自動加上了finally還有關閉的語句了。
這樣可以是我們更加專注於業務,不在寫冗餘的finally等程式碼了。

用法與注意點

採用此語法糖方式很簡單,JDK≥1.7。
而且需要寫在try()裡面的變數支援JDK中提供的Autoclose介面

 1 //
 2 // Source code recreated from a .class file by IntelliJ IDEA
 3 // (powered by Fernflower decompiler)
 4 //
 5 
 6 package java.lang;
 7 
 8 public interface AutoCloseable {
 9     void close() throws Exception;
10 }

括號內語句支援多個變數,用分號分隔,類似就是多條語句

1 try(Connect conn = ....;
2 InputStream is = ......;)

這樣,jdk在編譯的時候就會自動生成相應的finally和close語句了。