try-with-resources

Ajisai·2023년 7월 12일
0

Java

목록 보기
1/17

try-catch-finally

Scanner s = null;
try {
    s = new Scanner(System.in);	
} catch(Exception e) {
	// Something
} finally {
    if (s != null) {
        try { s.close(); }
        catch(Exception e) { /* NOP */ }
    }
}

이렇게 하면 반드시 close()가 실행되어 resource를 안정적으로 운용할 수 있게 된다.
근데 매번 NullPointerException을 직접 체크해야 하고, code depth가 늘어나 finally 블록이 지저분해진다는 단점이 있다.

try-with-resources

그래서 최근에는 다음과 같은 문법이 추가되었다.

try(
    BufferedReader br = new BufferedReader(
        new InputStreamReader(System.in, "UTF-8")
    )
) {
    //...
} catch (UnsupportedEncodingException e) {
    //...
} catch (IOException e) {
    //...
}
  • try {}가 아닌 try() {}로 쓰며, () 안에는 사용할 resource가 선언된다.
  • 여기 안에 들어가는 건 AutoCloseable의 구현 객체여야 한다. 각종 I/O stream, socket 등이 다 여기에 해당하니까 크게 신경쓸 필요는 없다. 어지간하면 다 된다.
  • close()는 따로 호출하지 않아도 된다.
  • 애초에 맨 끝에 finally { br.close(); }를 추가하면 br이라는 이름을 찾을 수 없다는 에러가 발생한다(br의 scope는 try { } 안으로 한정되므로)

근데 try 문 자체가 꽤나 느린 편이라 알고리즘 문제 풀 때는 안 쓰는 걸 추천한다.

profile
Java를 하고 싶었지만 JavaScript를 하게 된 사람

0개의 댓글

관련 채용 정보