• 使用try-with-resources(推荐),不要使用try-finally。
  • 实现AutoCloseable接口,并实现close方法。
  • 使用try-with-resources可以捕获close中的异常,通过throwable的getSuppressed
  • 在退出try-with-resources块的时候会自动调用close方法。下面是AutoCloseable的文档说明

AutoCloseable使用与注意,try-with-resources(推荐)_sed

package org.ziegler.javabase.autoClaseable;

public class CloseableObjectA implements AutoCloseable {
public CloseableObjectA() {
System.out.println("CloseableObjectA");
}

@Override
public void close() {
System.out.println("CloseableObjectA.close");

throw new RuntimeException("CloseableObjectA.close throw exception");
}

public void testException() {
throw new RuntimeException("throwException test");
}
}
package org.ziegler.javabase.autoClaseable;

public class CloseableObjectB implements AutoCloseable {
public CloseableObjectB() {
System.out.println("CloseableObjectB");
}

@Override
public void close() {
System.out.println("CloseableObjectB.close");
throw new RuntimeException("CloseableObjectB.close throw exception");
}
}
package org.ziegler.javabase.autoClaseable;

import org.junit.jupiter.api.Test;

public class CloseableTest {

@Test
void test() {

try (CloseableObjectA closeableObjectA = new CloseableObjectA();
CloseableObjectB closeableObjectB = new CloseableObjectB()) {

System.out.println("closeableObjectA.toString() = " + closeableObjectA.toString());
System.out.println("closeableObjectB.toString() = " + closeableObjectB.toString());

closeableObjectA.testException();
} catch (Throwable throwable) {
System.out.println("throwable:" + throwable.getMessage());
for (Throwable st : throwable.getSuppressed()) {
System.out.println("suppressed:" + st.getMessage());
}
} finally {
System.out.println("try-with-resources finally");
}
}
}