자바의 본질을 실무에 적용하는 이펙티브 자바 강의를 듣고 정리한 내용입니다
try 구문에서 Exception이 던져져도 무조건 finally가 실행됨
public void updateScore(){
try{
System.out.println("1");
throw new RuntimeException((String) null);
} finally {
System.out.println("3");
}
}
아래 실행 결과에서 try 절에서 Exception이 발생했으나 finally가 실행된 걸 확인 가능함
static String firstLineOfFile(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try{
return br.readLine();
}finally {
br.close();
}
}
finally는 코드가 너무 지저분해진다는 문제가 있음
또 아래와 같은 경우 추적이 어려워짐
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[100];
int n;
while ((n=in.read(buf))>=0){ //[1]
out.write(buf,0,n);
}
}finally { //[2]
out.close(); //근데 이것도 실패 또 익셉션
}
}finally { //[3]
in.close();
}
}
두번째 예시와 같이 중첩적으로 try finally를 사용했을 때
[1]에서 EXCEPTION이 나고,[2]에서 또 EXCEPTION이 났다고 가정하자-
[3]에서 [2]에서 작성되었던 에러가 오버라이드 될 수 있음
static String firstLineOfFile2(String path) throws IOException {
try(BufferedReader br = new BufferedReader(new FileReader(path))){
return br.readLine();
}
}
static void copy2(String src, String dst) throws IOException {
try(InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst)){
byte[] buf = new byte[100];
int n;
while ((n=in.read(buf))>=0){
out.write(buf,0,n);
}
}
}