-try-with-resources문?
try-catch문의 변형 이고 입출력(I/O)과 관련된 클래스를 사용할 때 유용하다.
꼭 close를 해주어야 하는 클래스들이 있는데 -try-with resources문을 사용하면
따로 close를 호출하지 않아도 try블럭을 벗어날때 자동으로 close가 호출된다.
try-catch-finally 코드를 보자
try {
FileInputStream fis = new FileInputStream("score.dat");
DataInputStream dis = new DataInputStream(fis);
} catch (IOException ie) {
ie.printStackTrace();
} finally {
//finally에 close를 넣어주었고 close에도 try-catch문이 필요해서 또 try-catch를 선언했다.
try {
if(dis != null) {
dis.close();
}
} catch (IOException ie) {
ie.printStackTrace();
}
}
}
위와 같이 close를 처리 하기 위해 try-catch를 한번 더 사용했고 그로 인해 코드가 보기에 좋지 않다.
더 나쁜 것은 try블럭과 finally블럭에서 모두 예외가 발생하면 try블럭의 예외는 무시된다는 것이다.
try-with-resources 코드를 보자
//괄호() 안에 두 문장 이상 넣을 경우 ';'로 구분한다.
try ( FileInputStream fis = new FileInputStream("score.dat") ;
DataInputStream dis = new DataInputStream(fis) ) {
...
} catch (IOException ie) {
ie.printStackTrace();
}
}
try-with-resources문의 괄호()안에 객체를 생성하는 문장을 넣으면, 이 객체는 따로 close()를 호출하지 않아도
try블럭을 벗어날때 자동으로 close()가 호출된다. 그 후 catch블럭과 finally 블럭이 실행된다.
하지만 무조건적으로 close()가 실행되는건 아니고 클래스가 AutoCloseable
인터페이스를 구현한 것이어야만 한다.
public interface AutoCloseable {
void close() throw Exception;
}
public static void main(String[] args) {
try(ExamClass ec = new ExamClass()){
ec.method();
}catch (Exception e) {
}
}
class ExamClass implements AutoCloseable{
public void method() throws Exception {
System.out.println("ExamClass... method ... ing");
}
public void close() throws Exception {
System.out.println("Exam close()..");
}
}
이 코드를 실행하면, close()가 작동한 다는 것을 알 수 있다.
ExamClass... method ... ing
Exam close()..
댓글