자바

JAVA 자바 예외처리 : 자동 리소스 닫기

알통몬_ 2017. 3. 13. 10:59
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

자동 리소스 닫기

try - with - resources 를 사용하면 예외 발생 여부와 상관없이 사용했던

 리소스 객체( 각종 입출력 스트림, 서버 소켓, 소켓, 각종 채널) 의 

close() 메서드를 호출해서 안전하게 리소스를 닫아 줍니다. 

리소스 : 예외 처리 부분에서는 데이터를 읽고 쓰는 객체. 

예를 들어서 파일의 데이터를 읽는 FileInputStream 객체와 파일에 쓰는 FileOutputStream 은 

리소스 객체라고 보면 됩니다. 

 자바 7에서 추가된 try - with - resources 는 아래와 같이 사용합니다.

try(FileInputStream fis = new FileInputStream("file.txt")) {

        ...

} catch(IOException e) {

     ...

}

try 블록이 정상적으로 실행을 완료했거나 도중에 예외가 발생하게 되면 

자동으로 FileOutputStream의 close() 메서드가 호출됩니다. 

try { } 에서 예외가 발생하면 우선 close() 리소소를 닫고 catch 블록을 실행합니다. 

만약 여러 개의 리소스를 사용해야한다면 아래와 같이 작성할 수 있습니다.

try(

FileInputStream fis = new FileInputStream("file.txt");

FileIOututStream fos = new FileOutputStream("file2.txt")

) {

        ...

} catch(IOException e) {

     ...

}


* try - with - resources 를 사용하기 위해서는 한가지 조건이 있습니다. 

리소스 객체는 java.lang.AutoCloseable 인터페이스를 구현하고 있어야 합니다. 

AutoCloseable 에는 close()메서드가 정의되어 있는데 

try - with - resources는 바로 이 close() 메서드를 자동 호출합니다.

API 도큐먼트에서 AutoCloseable 인터페이스를 찾아 "All Known Implementing Classes"를 보면

try - with - resources와 함께 사용할 수 있는 리소스가 어떤 것이 있는지 알 수 있습니다.


아래 예제는 AutoCloseable을 구현해서 FileInputStream 클래스를 작성합니다. main() 메서드에서 

try - with - resources를 사용하면 예외가 발생하는 즉시 

자동으로 FileInputStream의 close()메서드가 호출되는 것을 볼 수 있습니다.

예제)

구현 클래스

public class FileInputStream implements AutoCloseable {

private String file;

public FileInputStream(String file) {

this.file = file;

}

public void read() {

System.out.println(file + "을 읽습니다.");

}

@Override

public void close() throws Exception {

System.out.println(file + "을 닫습니다.");

}

 

}

실행 클래스

public class TryWithResourceExample {

public static void main(String[] args) {

try (FileInputStream fis = new FileInputStream("file.txt")) {

fis.read();

throw new Exception();

} catch(Exception e) {

System.out.println("예외 처리 코드가 실행되었습니다.");

}

}

 

}

반응형