Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 고객센터 구현
- 프로그래머스
- 이메일로 인증코드 전송 구현
- 다중 카테고리 구현
- java
- 세션
- js
- jsp
- Oracle
- jsp 프로젝트
- 코딩
- ajax
- Sts
- MVC
- 인증코드로 비밀번호 변경 구현
- Level 1
- 오라클
- 자바
- 대분류/중분류/소분류
- 교보문고 따라하기
- Spring
- jquery
- 스프링
- SESSION
- 일단_해보는거야
- 로그인과 장바구니 구현
- Spring MVC
- jakarta.mail
- json
- MySQL
Archives
감 잃지말고 개발하기
[Java][Exception] 예외처리 try-with-resources 문 본문
정의 및 사용
- 자바 7부터 도입된 기능이다.
- 리소스(시스템에서 사용하는 자원을 의미)를 사용할 때 정상인 경우와 예외가 발생한 경우 모두 자동으로 닫아주는 역할을 수행한다.
- 일반적으로 파일이나 네트워크, 데이터베이스 연결 등의 외부 리소스는 사용 후 반드시 닫아줘야 한다.
- 이전에는 try-catch-finally 문의 finally 블록에서 자원을 닫아주는 코드를 작성해야 했지만, try-with-resources 문을 사용하면 더 간결하고 안전한 코드를 작성할 수 있다.
- 이를 통해 개발자는 자원을 닫아주는 코드를 명시적으로 작성할 필요가 없다.
- 사용한 리소스를 자동적으로 닫을 때 close() 메서드가 사용되는데, 이 메서드는 AutoCloseable 인터페이스의 메서드이다.
- 따라서 try-with-resources 문을 사용하기 위해선 사용할 리소스가 AutoCloseable 인터페이스를 구현해야 한다.
- AutoCloseable 인터페이스를 구현한 클래스는 close() 메서드를 명시적으로 호출하지 않아도 close() 메서드 부분을 호출한다.
기본 구문
try (자원 초기화) {
// 자원을 사용한 코드
} catch (Exception e) {
// 예외 처리 코드
}
만약 리소스를 여러 개 생성해야 한다면 세미 콜론(;)으로 구분한다.
try(A a = new A(); B b = new B()) {
// 자원을 사용한 코드
} catch(Exception e) {
// 예외 처리 코드
}
수행
1. try 괄호 안에 사용할 리소스를 선언하는 코드를 작성한다.
- 이 코드는 해당 리소스를 생성하고 초기화하는 역할을 수행한다.
2. try 블록을 실행한다.
- try 블록을 빠져나갈 때 해당 리소스의 close() 메서드(AutoCloseable 인터페이스의 close())가 자동으로 호출되어 닫힌다.
3. 예외가 발생한 경우 catch 블록을 실행한다.
- 예외 처리에 관한 로직이 실행된다.
예시
AutoCloseable 인터페이스를 직접 구현한 AutoCloseObj 클래스를 만들어 테스트해 보자.
package exception;
public class AutoCloseObj implements AutoCloseable{
@Override
public void close() throws Exception {
System.out.println("리소스가 close() 되었습니다.");
}
}
경우 1. 정상적으로 종료되는 경우
package exception;
public class AutoCloseTest {
public static void main(String[] args) {
try(AutoCloseObj obj = new AutoCloseObj()){
} catch (Exception e) {
System.out.println("예외 부분입니다.");
}
}
}
결과
경우 2. 예외가 발생해 종료되는 경우
강제로 예외를 만들기 위해 throw new Exception(); 을 추가했다.
package exception;
public class AutoCloseTest {
public static void main(String[] args) {
try(AutoCloseObj obj = new AutoCloseObj()){
throw new Exception();
} catch (Exception e) {
System.out.println("예외 부분입니다.");
}
}
}
결과
예외가 발생한 콘솔 출력 결과를 보면 리소스의 close() 메서드가 먼저 호출되고 예외 블록 부분(catch)이 수행되는 것을 확인할 수 있다.
이처럼 try-with-resources문을 사용하면 close() 메서드를 명시적으로 호출하지 않아도 정상 종료된 경우와 예외가 발생한 경우 모두 리소스가 해제된다.
향상된 try-with-resources문
- 자바 9에서 추가된 문법이다.
- 자바 9부터는 외부에서 선언한 리소스 변수를 try문 괄호 안에서 사용할 수 있다.
자바 7의 try-with-resources문
기존 자바 7의 문법에서는 AutoCloseable 인터페이스를 구현한 리소스의 변수 선언을 try문 괄호 안에서 해야 했었다.
따라서 리소스가 외부에서 선언되고 생성된 경우에도 다른 참조 변수로 괄호 안에서 다시 선언해야 하는 번거로움이 존재했다.
AutoCloseObj obj = new AutoCloseObj();
try(AutoCloseObj obj2 = obj) {
// 리소스 사용 처리
} catch(Exception e) {
// 예외 처리
}
자바 9의 try-with-resources문
하지만 자바 9부터는 아래 예시처럼 외부에서 선언한 리소스 변수 obj를 try문의 괄호 안에서 사용할 수 있게 되었다.
AutoCloseObj obj = new AutoCloseObj();
try(obj) {
// 리소스 사용 처리
} catch(Exception e) {
// 예외 처리
}
끝.
'Java > Grammer' 카테고리의 다른 글
[Java][JSON][파싱] JSON 배열 파싱하기 (0) | 2023.04.10 |
---|