try-finally 보단 try-with-resources를 사용하라

Gunjoo Ahn·2022년 8월 15일
0
post-thumbnail

try-catch-finally와 throw, throws

Java에서는 try-catch-finallythrow, throws 키워드가 있다.

try-catch-finally : try 블록에서 로직을 실행한다. catch 블록은 try 블록에서 발생한 예외를 catch 해 처리한다. 마지막 finally 블록에서 try 블록 종료에 이후 로직을 처리한다.

throw : 개발자가 직접 예외를 발생시키는 키워드이다.

throws : 메서드에서 발생하는 예외에 대한 처리를 자신을 호출한 메서드에게 넘기겠다는 키워드이다.

finally

finally 블록은 살짝 특수하다. trycatch 블록이 일단 실행이 되면, finally 블록의 실행은 보장이 된다. try 에서 return, continue, breakcatch에서 throw를 하는 등 블록이 종료되어도 항상 finally 블록이 실행된다는 이야기다. 만약 finally 블록에서 return이나 throw를 해버리면 try, catch에서 실행한 returnthrow는 무시된다.

finally 블록의 문제

위에서 보았듯 finally 블록의 실행은 보장이 되고, finally 블록에서 발생하는 return 이나 throwtry, catch에서 발생한 return, throw를 무시하게 된다. 문제는 이 무시한다는 점이다. try에서 발생한 예외를 넘겨서 디버깅을 해야하는데 finally에서 새로운 예외를 넘겨버리는 것이다. 이 것은 디버깅을 어렵게한다.

try-with-resources

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로 정확하고 쉽게 자원을 회수할 수 있다.

Reference

https://webclub.tistory.com/71
https://sundrystore.tistory.com/14

profile
Backend Developer

0개의 댓글