반응형
꼭 회수해야 하는 자원은 try-with-resources를 사용하자
try-finally의 단점
우리는 자원의 닫힘을 보장하는 수단으로 try-finally를 써왔다.
static void copy(String src, String dst) throws IOException{ InputStream in = new FileInputStream(src); try { OutputStream out = new FileOutputStream(dst); try { byte[] buf = new byte[BUFFER_SIZE]; int n; while ((n = in.read(buf)) >= 0) out.write(buf, 0, n); } finally { out.close(); } }finally { in.close(); } }
- 코드의 가독성이 떨어진다.
- 두 번째 예외가 첫 번째 예외를 먹게되어, 첫 번째 예외에 관한 정보가 남아있지 않게 된다.
물론 첫 번째 예외를 기록하도록 코드를 수정할 수 있지만, 코드는 더욱 지저분해질 것이다.
try-with-resources
- 위 문제를 해결하기 위한 자바 7때 나옴
- AutoCloseable 인터페이스를 구현해야 사용 가능하다.
static void copy(String src, String dst) throws IOException { try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dst)) { byte[] buf = new byte[BUFFER_SIZE]; int n; while ((n = in.read(buf)) >= 0) out.write(buf, 0, n); } }
- 읽기 쉬워진다.
- 보여줄 예외는 보여지고, 나머지 다른 예외가 숨겨질 수 있다. 이때 숨겨진 예외들도 버려지지 않고, 스택 추척 내역에 suppressed 꼬리표를 달고 출력된다.
- try-with-resources에서도 catch 절을 쓸 수 있다. try 문을 중첩하지 않고도 다수의 예외를 처리할 수 있다.
반응형
'Reading Book > 이펙티브 자바' 카테고리의 다른 글
[이펙티브 자바] 클래스와 인터페이스를 유연하게 만드는 방법 (0) | 2022.12.12 |
---|---|
[이펙티브 자바] Object 메소드 관련 규약 + Comparable (0) | 2022.12.12 |
[이펙티브 자바] 불필요한 객체 생성을 피하고, 다 쓴 객체 참조를 해제하자 (0) | 2022.12.11 |
[이펙티브 자바] 자원 직접 명시보다는 의존 객체 주입을 사용하기 (0) | 2022.12.11 |
[이펙티브 자바] private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2022.12.11 |