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
문 자체가 꽤나 느린 편이라 알고리즘 문제 풀 때는 안 쓰는 걸 추천한다.