본문 바로가기

Java

JAVA :: exception :: throw 문이 있는 try, catch, finally

try ~ catch 문은 예외(exception) 처리를 해줘서, 원하는 결과가 아닌 예외적인 상황(대부분 에러)이 발생했을 때 이를 처리할 수 있도록 해 준다.


try ~ catch 문에서 finally 는 예외가 발생하던 하지 않던 반드시 처리해줘야 하는 부분을 기술할 때 쓰인다. 예를 들어 네트워크에서 커넥션(connection) 을 받아왔다가 닫아줘야 하는 경우 connection.close() 를  finally 문 내에 선언해 줌으로써 예외가 발생하던 하지 않던 간에 열어줬던 커넥션을 꼭 닫아주도록 한다. (커넥션이라 함은, 네트워크 상에서 원거리에 있는 다른 프로세스와 통신을 하기 전에 먼저 나와 연결되도록 해야하는데, 그렇게 해서 연결된 그 연결을 connection 이라고 한다. 그러므로, 커넥션을 열어주고, 할 일이 끝나면 커넥션을 닫아준다는 식으로 표현되는 것이다.)


자, 그럼 지난 시간에 이어 과연 try ~ catch 문 안에서 throw 문이 있으면 어떻게 될까?? 간단한 것이므로 실험을 해봤다 아래는 소스코드.



public class TestJava {

    public boolean test(int i) throws Exception{

        try {

              System.out.println("i : " + i);

              if(i == 1)

                     throw new Exception();

              return true;

        }

        catch (Exception e) {

              System.out.println("exception");

              throw e;

        }

        finally{

              System.out.println("finally");

        }

    }

 

    public static void main(String args[]) throws InterruptedException {

        TestJava java = new TestJava();

        try {

               java.test(0);

               System.out.println("==========================================");

               java.test(1);

        catch (Exception e) {

               System.out.println("Main catches exception");

        }

    }

}



보는 바와 같이 test(int i) 메소드 안에서 전달되는 i 의 값을 출력 시킨 후, i 의 값에 따라 1이면 익셉션을 발생시켜 주고, 1이 아닐 경우 true 를 바로 리턴한다. 그리고 익셉션이 발생한 경우 catch 문에서 익셉션을 잡아서 "exception" 이라고 출력한 뒤, 다시 throw 문을 통해 test 메소드를 호출하는 쪽에서 익셉션을 처리 하도록 만든다. 그래서 test() 메소드의 머리 부분에 throws Exception 이 추가된 것이다. 이렇게 throw 된 뒤에도 finally 문이 실행되는지 확인해보기 위해 finally 문 안에서 "finally" 가 출력되도록 하였다. 그리고 실행 해본 결과는 아래와 같다.




throw 에 상관없이 finally 문이 실행되는 것을 알 수 있다.


결론은

finally 문 내부에 있는 내용은 익셉션이 발생하든 하지 않든, 리턴문이 있던 없던, throw 문을 쓰든 안 쓰든 

무조건 무조건 실행된다.