-
아이템9. try-finally보다는 try-with-resources를 사용하라책/이펙티브자바 2021. 6. 26. 18:34
- 자바 라이브러리에는 close 메소드를 호출해 직접 닫아줘야 하는 자원이 많다.
- ex) InputStream, OutputStream, java.sql.Connection
- 자원 닫기는 클라이언트가 놓치기 쉬워 예측할 수 없는 성능 문제로 이어지기도 한다.
- 상당수가 finalizer 를 안전망으로 사용하지만 믿을만하지 못하다. (아이템 8)
- 이전에는 자원이 제대로 닫힘을 보장하는 수단으로
try-finally
를 주로 사용했다.
try-finally
// 자원이 1개인 경우 static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } }
// 자원이 2개인 경우 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-finally 의 결점
- 예외는 try블록, finally 블록에서 모두 발생할 수 있다.
- 만약 try블록, finally 블록 모두에서 예외가 한다면 finally 에서의 예외가 try 블록의 예외를 집어삼켜 버려 스택 추적내역에 첫 번째 예외에 관한 정보는 남지 않게되어 디버깅을 어렵게 한다.
try-with-resources
- 해당 자원이
AutoCloseable
인터페이스를 구현해야한다. - 가독성이 좋다.
- 자원을 닫지 않는 실수를 막을 수 있다.
- 예외가 양쪽에서 발생하면, 보여줄 예외 하나만 보존되고 여러 개의 다른 예외가 숨겨질 수도 있다.
- 이렇게 숨겨진 예외들도 버려지지 않고, '숨겨졌다. suppressed' 꼬리표를 달고 출력된다.
// 자원이 1개인 경우 static String firstLineOfFile(String path) throws Exception { try (BufferedReader br = new BufferedReader ( new FileReader(path))) { return br.readLine(); } }
// 자원이 2개인 경우 static void copy(String src, String det) 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); }
결론
예외없이
try-finally
말고try-with-resources
를 사용하자.'책 > 이펙티브자바' 카테고리의 다른 글
아이템11. equals를 재정의하려거든 hashCode도 재정의하라 (0) 2021.07.02 아이템10. equals는 일반 규약을 지켜 재정의하라 (0) 2021.07.02 아이템8. finalizer와 cleaner 사용을 피하라 (0) 2021.06.26 아이템7. 다 쓴 객체 참조를 해제하라 (0) 2021.06.23 아이템6. 불필요한 객체 생성을 피하라 (0) 2021.06.23 - 자바 라이브러리에는 close 메소드를 호출해 직접 닫아줘야 하는 자원이 많다.