[EffectiveJava] item 9 . try - finally 보다는 try - with - resources 를 사용하라.

item 9

try - finally 보다는 try - with - resources 를 사용하라.

try-finally - 더 이상 자원을 회수하는 최선의 방책이 아니다!

    static String firstLineOfFile(String path) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(path));
        try {
            return br.readLine();
        } finally {
                br.close();
        } 
    }

자원이 둘 이상이면 try-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[BUFFER_SIZE];
                int n;
                while ((n = in.read(buf)) >= 0) {
                   out.write(buf, 0, n);
            } finally {
                    out.close();
            }
        } finally {
                in.close();
        }
    }
}

try-with-resources - 자원을 회수하는 최선책!

static String firstLineOfFile(String path) throws IOException {
    try(BufferedReader br = new BufferedReader(new FileReader(path))){
        return br.readLine();
    }
}

복수의 자원을 처리하는 try-with-resources - 짧고 매혹적이다!

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-with-resources 를 catch 절과 함께 쓰는 모습

static String firstLineOfFile(String path, String defaultVal){
    try(BufferedReader br = new BufferedReader(new FileReader(path))){
      return br.readLine();
    } catch(IOException e){
      return defaultVal; 
    }
}