AutoCloseable使用与注意,try-with-resources(推荐)
原创
©著作权归作者所有:来自51CTO博客作者wx61a48c2d77c92的原创作品,请联系作者获取转载授权,否则将追究法律责任
- 使用try-with-resources(推荐),不要使用try-finally。
- 实现AutoCloseable接口,并实现close方法。
- 使用try-with-resources可以捕获close中的异常,通过throwable的getSuppressed
- 在退出try-with-resources块的时候会自动调用close方法。下面是AutoCloseable的文档说明

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");
}
}
}