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语句了。

你可能感兴趣的:(try语法糖)