🔍 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 구문과 프로그램 종료가 먼저 실행된다는 걸 확인할 수 있다.
'개발 > Java' 카테고리의 다른 글
[Java] 사용자 정의 예외 (0) | 2023.03.01 |
---|---|
[Java] 예외 처리 위임(던지기 => throws) (0) | 2023.03.01 |
[Java] try~catch (0) | 2023.03.01 |
[Java] Wrapper 클래스 (0) | 2023.02.25 |
[Java] toString() 메서드 (0) | 2023.02.25 |