[effective java] (4) try-finally 보다는 try-with-resources를 사용하라

orca·2022년 11월 1일
0

effective java

목록 보기
4/8
post-thumbnail

자바의 본질을 실무에 적용하는 이펙티브 자바 강의를 듣고 정리한 내용입니다

try-finally

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]에서 작성되었던 에러가 오버라이드 될 수 있음

try-with-resources

 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);
            }
        }
    }

0개의 댓글