개발언어

try-with-resources

Surge100 2021. 12. 23. 17:21

-try문이 자원하고 같이 있는 경우

 

  • Catch

try{

   //SomeException을 발생하는 구문

   //Exception이 발생되고 나서는 실행이 안된다.

}catch(SomeException e){

   //SomeException이 발생할 때 처리

   //Exception이 발생이 안되면 실행이 안된다.

}finllay{

   //Exception 발생여부와 상관 없이 항상 처리

}

 

-finally : 가장 중요한 목적이 자원의 해제이다.try구문에서 무언가를 실행하다가 자원을 open했다고 가정, 실행도중에 Exception이 발생을 하건 안하건 항상 실행되는 게 finally.

꼭, 중간에 catch문이 있어야 사용하는건 아니다. 자원을 해제할려고 사용 하는것

 

자원같은 경우는 한번 open을 하면 반드시 close를 해야한다.

 

  • finally사용

FileReader in = null;

try{

   in = new FileReader(..);

   char c = (char)in.read();

   System.out.println(c);

}catch(IOException e){

   //IOException 처리

}finally{

   if(in !=null)

       in.close();

}

 

결국 in을 close하기위해서 finally를 쓰는데, in에 문제가 생겨서 null로 남겨 졌는데, 바로 in.close해버리면 

NullPointException이 나니까, 반드시 확인을 하고 in.close를 해야한다.

 

  • try-with-resources

     try(FileReader in = new FileReader()){

     char c = (char)in.read();

     }catch(IOException e){

       //IOException 처리

     }

-try/catch문이 복잡하고 지저분해 진 것을 정리하여 쓰기위해 등장

try하고 '()'안에 해제해야 하는 자원을 넣는것, 괄호안에서 선언된 자원은 finally를 안해도 자동 해제된다.

단, 모든 자원이 다 close되는 것은 아니고

 

BufferedReader extends Reader =>

Reader implements Readable,Closeable =>

Closeable extends AutoCloseable

 

Closeable이나 AutoCloseable을 interface를 implements 한 자원은 자동으로 close된다.

(예:Scanner,BufferedReader)

 

FileReader in = new FileReader("alphabet.txt");
        BufferedReader reader = new BufferedReader(in))

FileReader in 같은 경우에는 try 구문  괄호 안에 있기 때문에 자원이 해제된다고 볼 수 도 있지만,

파이프로 BufferedReader안에 다시 FileReader in이 들어간 형태이다. 이런 경우 reader가 close되면,

파이프로 들어간 in도 자동으로 close된다.