try語法糖

背景

臨時接到一個查詢數據庫數據并生成txt文件,并打包zip上傳到ftp的功能。
代碼自然不算特別復雜,但是發現我們項目使用了1.7的jdk后,瞬間來了興趣,以前一直想用沒敢用的要拿上來試試看了。

簡略代碼如下

普通寫法自然是類似這樣

private static void generateData(DateTime time, String dataPath) {
        Connection connection = (Connection)DBUtil.getConnection(DataBaseType.MySql, Constant.MYSQL_URL, Constant.MYSQL_USERNAME, Constant.MYSQL_PWD);
        try {
               ///查詢語句

               /// 寫入文件

        } catch (Exception e) {

        }finally{
                IOUtils.closeQuiet(connection);
        }
    }

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

private static void generateData(DateTime time, String dataPath) {
        try (Connection connection = (Connection) DBUtil.getConnection(DataBaseType.MySql, Constant.MYSQL_URL,
                Constant.MYSQL_USERNAME, Constant.MYSQL_PWD)) {
               ///查詢語句

               /// 寫入文件

        } catch (Exception e) {

        }
    }

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

private static void generateData(DateTime time, String dataPath)
    {
        Connection connection;
        Throwable throwable;
        connection = (Connection)DBUtil.getConnection(DataBaseType.MySql, Constant.MYSQL_URL, Constant.MYSQL_USERNAME, Constant.MYSQL_PWD);
        throwable = null;
        try
        {
               ///查詢語句

               /// 寫入文件

        }
        catch(Throwable throwable1)
        {
            throwable = throwable1;
            throw throwable1;
        }
        if(connection != null)
            if(throwable != null)
                try
                {
                    connection.close();
                }
                catch(Throwable x2)
                {
                    throwable.addSuppressed(x2);
                }
            else
                connection.close();
        break MISSING_BLOCK_LABEL_486;
        Exception exception;
        exception;
        if(connection != null)
            if(throwable != null)
                try
                {
                    connection.close();
                }
                catch(Throwable x2)
                {
                    throwable.addSuppressed(x2);
                }
            else
                connection.close();
        throw exception;
        Exception e;
        e;
    }

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

用法與注意點

采用此語法糖方式很簡單,JDK≥1.7。
而且需要寫在try()里面的變量支持JDK中提供的Autoclose接口

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package java.lang;

public interface AutoCloseable {
    void close() throws Exception;
}

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

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,420評論 25 708
  • 生活中總會有驚喜,也會有無奈,也會有令自己非常尷尬卻沒有退路的誤會。
    果然太弱閱讀 106評論 0 0
  • 回想這個階段在分身訓練營的學習,從第一節課認識分身術,到語言、情緒、信念的學習,收獲很多。作為初入職場的小白,工作...
    melodyZhang閱讀 339評論 11 0
  • 死生契闊,與子成說。 執子之手,與子偕老。 七年,不多不少。 我們記憶中一路走來的美好,都歷歷在目。從我們朋友時的...
    子卿的花期閱讀 247評論 0 0