개발/Java

[Java] try ~ catch ~ finally

suniverse 2023. 3. 1. 17:49

🔍 finally 구문 

- 기본적으로 try ~ catch 블록의 역할을 동일하지만 

  finally 블록에 기술된 코드들은 예외 발생 여부와 관계없이 실행된다. 

- 일반적은 try 구문 바깥의 코드도 예외 발생여부와 관계없이 실행되지만 

  try ~ catch 블록 내에서 return 문의 사용으로 인해 메서드 수행이 종료되더라도 

  반드시 finally  블록의 코를 실행한 후에 메서드가 종료된다. 

- 주로, 데이터베이스 작업(JDBC)이나 파일 작업을 위해 DB서버 등의 자원 사용 시 

  예외가 발생하더라도 자원을 반환하기 위한 코드는 무조건 실행되어야 하므로 

  finally 블록 내에 자원 반환 코드를 기술한다. 그러면 예외 발생여부와 관계없이 실행된다. 

 

✍ finally 구문 예시 

public static void main(String[] args) {
    System.out.println("프로그램 시작!");
    try {
        System.out.println("try 블록 시작!");
        int a = 10;
        int b = 2;
        System.out.println("a / b = " + (a/b));
        System.out.println("try 블록 끝!");
    } catch (Exception e) {
        System.out.println("예외 발생!");
    } finally {
        System.out.println("이 문장은 예외 발생 유무 관계없이 실행됩니다!");
    }
}

=> try 블록 내부에 기술한 코드는 예외가 발생하지 않는 코드이다. 

그럼 이 코드를 실행시켰을 때 어떤 문자열들이 출력될까? 

 

💻

=> 예외가 발생되지 않았으므로, 예외 발생 문자열을 제외하고 모든 문장이 출력되었다. 

특히 finally 구문은 예외 발생 유무와 관계 없이 실행된 걸 확인할 수 있다. 

 

💻 예외가 발생했을 경우 예시 

=> 예외가 발생했음에도 finally 구문이 실행된 걸 확인할 수 있다. 

 

✍ 메서드 호출 시 예시 

public static void main(String[] args) {
    System.out.println("메서드 호출 시작!");
    method();
    System.out.println("메서드 호출 종료!");
}

public static void method() {
    try {
        System.out.println("try 블록 시작!");
        int a = 10;
        int b = 0;
        System.out.println(a/b);
        System.out.println("예외 미발생 - try 블록 끝!");
        return;
    } catch (Exception e) {
        System.out.println("예외 발생!");
    } finally {
        System.out.println("finally 구문!");
    }
    System.out.println("모든 구문 끝!");
}

💻

예외 발생 시 메서드 호출 순서를 정리해보자면 

메서드 호출 => try 블록 코드 실행 => 예외 발생 => finally 구문 실행 => 프로그램 종료 => 메서드 호출 종료 이다. 

즉, 메서드 호출 종료보다 finally 구문과 프로그램 종료가 먼저 실행된다는 걸 확인할 수 있다.