Try-With-Resource

通过查看demo1编译后的.class文件来了解下Try-With-Resource相较于Try-Finally的优势在哪:

private static void demo1(){
        try(Connection conn = new Connection()){
            conn.sendData();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

.class

private static void demo1() {
        try {
            Connection conn = new Connection();
            Throwable var1 = null;

            try {
                conn.sendData();
            } catch (Throwable var11) {
                var1 = var11;
                throw var11;
            } finally {
                if (conn != null) {
                    if (var1 != null) {
                        try {
                            conn.close();
                        } catch (Throwable var10) {
                            var1.addSuppressed(var10);
                        }
                    } else {
                        conn.close();
                    }
                }

            }
        } catch (Exception var13) {
            var13.printStackTrace();
        }

    }
  1. 业务代码中不需要专门写close语句来关闭资源,使业务代码更清晰
  2. 简化了异常的处理代码, 而不需要嵌套的try-catch
  3. addSuppressed可以展示多层异常情况, 而不会吞掉关键异常, 有助于排查问题

可以执行以下四个Case来体会try-with-resource的好处
TryWithResourceDemo.java

public class TryWithResourceDemo {

    public static void main(String[] args) {
        demo1();
        demo2();
        demo3();
        demo4();
    }

    private static void demo1(){
        try(Connection conn = new Connection()){
            conn.sendData();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void demo2(){
        try (ConnectionThrowable conn = new ConnectionThrowable()){
            conn.sendData();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    private static void demo3(){
        try(DecorateConnection decorateConn = new DecorateConnection(new Connection())) {
            decorateConn.sendData();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void demo4(){
        try(Connection conn = new Connection();
            DecorateConnection decorateConn = new DecorateConnection(conn)) {
            decorateConn.sendData();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Connection.java

public class Connection implements AutoCloseable {
    public void sendData(){
        System.out.println("Connection sendData");
    }

    @Override
    public void close() throws Exception {
        System.out.println("Connection closed");
    }
}

ConnectionThrowable.java

public class ConnectionThrowable implements AutoCloseable{

    public void sendData() throws Exception{
        System.out.println("Connection sendData");
        throw new Exception("sendData exception");
    }

    @Override
    public void close() throws Exception {
        System.out.println("Connection closed");
        throw new MyException("close exception");
    }
}

DecorateConnection.java

public class DecorateConnection extends Connection{
    private boolean closed = false;
    protected Connection conn;
    public DecorateConnection(Connection conn)  {
        this.conn = conn;
    }

    public void finish() throws Exception{
        System.out.println("DecorateConnection finish");
        throw new Exception("DecorateConnection finish exception");
    }

    public void close() throws Exception {
        if (!closed) {
            finish();

            conn.close();
            closed = true;
            System.out.println("DecorateConnection closed");
        }
    }
}

MyException.java

public class MyException extends Exception{
    public MyException(String message) {
        super(message);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值