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;
}
'Dev Book Review' 카테고리의 다른 글
[Effective Java 3rd] item2. 생성자와 매기변수가 많다면 빌더를 고려하라. (0) | 2022.01.13 |
---|---|
[Effective java 3rd] item4. 인스턴스 화를 막으려면 private 생성자를 사용하라 (0) | 2022.01.12 |
[클린 아키텍쳐] 1장. 설계와 아키텍처란? (0) | 2022.01.05 |
[Inflearn] 스프링 프레임워크 핵심기술, 백기선 (0) | 2020.07.28 |
[Effective Java 3rd] Item10. equals는 일반규약을 지켜 재정의하라 (0) | 2020.03.08 |