通过查看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();
}
}
- 业务代码中不需要专门写close语句来关闭资源,使业务代码更清晰
- 简化了异常的处理代码, 而不需要嵌套的try-catch
- 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);
}
}