JAVA · 예외처리
try-with-resources 심화
AutoCloseable 리소스를 자동으로 정리하는 패턴의 심화 활용입니다.
예외처리중급try-with-resourcesAutoCloseableclosesuppressed
핵심 설명
AutoCloseable 리소스를 자동으로 정리하는 패턴의 심화 활용입니다.
Java code
import java.io.*;
public class TryWithResources {
// AutoCloseable 구현
static class DatabaseConnection implements AutoCloseable {
final String name;
DatabaseConnection(String name) {
this.name = name;
System.out.println("연결: " + name);
}
void query(String sql) {
System.out.println("[" + name + "] " + sql);
}
@Override
public void close() {
System.out.println("해제: " + name);
}
}
public static void main(String[] args) {
// 여러 리소스 (역순으로 close)
try (var db1 = new DatabaseConnection("primary");
var db2 = new DatabaseConnection("replica")) {
db1.query("SELECT * FROM users");
db2.query("SELECT * FROM orders");
}
// 출력: 해제: replica -> 해제: primary (역순!)
// 기존 변수 참조 (Java 9+)
DatabaseConnection conn = new DatabaseConnection("legacy");
try (conn) { // 이미 선언된 변수 사용 가능
conn.query("SELECT 1");
}
// suppressed exceptions
try (var res = new AutoCloseable() {
public void close() throws Exception {
throw new Exception("close 에러");
}
}) {
throw new Exception("본문 에러");
} catch (Exception e) {
System.out.println("주 예외: " + e.getMessage());
for (Throwable s : e.getSuppressed()) {
System.out.println("억제 예외: " + s.getMessage());
}
}
}
}학습 팁
try 본문과 close() 모두 예외가 발생하면, 본문 예외가 주 예외가 되고 close 예외는 getSuppressed()에 저장됩니다.
주의할 점
close()에서 예외를 던지면 복잡해집니다. 가능하면 close에서는 예외를 로깅만 하고 던지지 않는 것이 좋습니다.
자주 묻는 질문
try-with-resources 심화란 무엇인가요?
AutoCloseable 리소스를 자동으로 정리하는 패턴의 심화 활용입니다.
try-with-resources 심화 학습 시 주의할 점은 무엇인가요?
close() 에서 예외를 던지면 복잡해집니다. 가능하면 close에서는 예외를 로깅만 하고 던지지 않는 것이 좋습니다.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.