Java에서는 try-catch-finally
와 throw
, throws
키워드가 있다.
try-catch-finally :
try
블록에서 로직을 실행한다.catch
블록은try
블록에서 발생한 예외를 catch 해 처리한다. 마지막finally
블록에서try
블록 종료에 이후 로직을 처리한다.throw : 개발자가 직접 예외를 발생시키는 키워드이다.
throws : 메서드에서 발생하는 예외에 대한 처리를 자신을 호출한 메서드에게 넘기겠다는 키워드이다.
finally
블록은 살짝 특수하다. try
나 catch
블록이 일단 실행이 되면, finally
블록의 실행은 보장이 된다. try
에서 return
, continue
, break
나 catch
에서 throw
를 하는 등 블록이 종료되어도 항상 finally
블록이 실행된다는 이야기다. 만약 finally
블록에서 return
이나 throw
를 해버리면 try
, catch
에서 실행한 return
과 throw
는 무시된다.
위에서 보았듯 finally
블록의 실행은 보장이 되고, finally
블록에서 발생하는 return
이나 throw
는 try
, catch
에서 발생한 return
, throw
를 무시하게 된다. 문제는 이 무시한다는 점이다. try
에서 발생한 예외를 넘겨서 디버깅을 해야하는데 finally
에서 새로운 예외를 넘겨버리는 것이다. 이 것은 디버깅을 어렵게한다.
Java 7에서 이러한 문제는 trt-with-resources를 통하여 해결되었다. 이 구조를 사용하려면 해당 자원이 AutoCloseable
인터페이스를 구현해야한다. 단순히 void
를 반환하는 close
메서드 하나만 정의한 인터페이스다. 닫아야하는 자원 클래스를 작성한다면 AutoCloseable
을 작성하자.
static String firstLineOfFile(String path, String defaultVal){
// BufferedReader는 try가 종료되면 자동으로 close 된다.
try (BufferedReader br = new BufferedReader(new FileReader(path))){
return br.readLine();
} catch(IOException e) {
return defaultVal;
}
}
꼭 회수해야 하는 자원을 다룰 때는 try-finally 말고, try-with-resources를 사용하자. 예외는 없다. 코드는 더 짧고 분명해지고, 만들어지는 얘외 정보도 훨씬 유용하다. try-with-resources로 정확하고 쉽게 자원을 회수할 수 있다.
https://webclub.tistory.com/71
https://sundrystore.tistory.com/14