[Effective Java 3rd] item 9. try-finally(JAVA6) 보다는 try-with-resources(JAVA 7)을 사용하라

try-finally(JAVA 6) 보다는 try-with-resources(JAVA 7)를 사용하라

  • try-fianally를 사용할 때 보다 try-with-resources를 사용할 때 코드가 짧아지고, 예외 처리가 유용하다.
  • try-with-resources는 try가 종료될 때 자동으로 자원을 해체해준다(AutoCloseable 구현 된 경우, close() 메소드를 호출한다)
static String firstLineOfFile(String path) throws IOException{
        try(BufferedReader br = new BufferReader(
            new FileReader(path))){
           return br.readLine();
            }
}
  • try(...) 안에 Reader 객체가 할당 되어있다. 여기에 선언한 변수를 try에서 사용한다.
  • try 문을 벗어나면 close를 호출한다.
  • 문제진단에 좋다. (readLine과 close 호출 양쪽에서 예외가 발생하면 readLine에서 발생한 예외가 기록된다)
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();
    }
 }
}
  • 자원이 2이상인 경우 try-finally 방식은 지저분하다.
  • try 예외 발생 후 finally도 예외가 발생할 경우 finally안의 예외가 기록으로 남아 디버그가 어렵다.(개발자는 먼저 발생하는 예외를 알고 싶다)
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);
  }
}
  • 문제를 진단하기에도 좋다
  • try문과 close에서 예외가 모두 발생할 때, try문 예외가 기록되고 나머지는 숨겨진다.
  • 숨겨진 예외들은 스택 추적 내용에 숨겨져있어 (suppresed) 꼬리표를 달고 출력된다.
  • 자바7의 getSuppresed 메서드를 이용하면 프로그램 코드에서 가져올 수 있다.
static String firstLineOfFile(String path, String defaultVal){
   try(BufferdReader br = new BufferedReader(
          new FileReader(path))){
      return br.readLine();
   }catch(IOException e){
       return defaultVal;
   }
}
  • try-with-resources에서도 catch 절 사용이 가능하다
  • catch를 이용하여 다수의 예외처리가 가능하다.

참고

AutoCloseable이란?

  • JAVA7부터 추가 된 인터페이스.
public interface AutoCloseable{
   void close() throws Exception;
}

댓글

Designed by JB FACTORY