체크예외와 런타임예외의 차이점
729
작성한 질문수 7
수업과 직접적으로 관련있다고 보긴 어려운 질문이지만, 체크예외와 런타임예외에 대해서 궁금증이 생겨서 질문 남깁니다!
아래 코드는 잘 실행됩니다. 그리고 IllegalStateException 오류가 잡히고 로그가 남습니다.
@Test
void b(){
try {
ex2();
}catch (IllegalStateException e) {
log.error("message",e);
}
}
private void ex2() throws RuntimeException{
RuntimeException ex = new IllegalStateException();
throw ex;
}
그러나 아래 코드는 오류를 제공합니다.
@Test
void a(){
try {
ex1();
}catch (SQLNonTransientException e) {
log.error("message",e);
}
}
private void ex1() throws SQLException{
SQLException ex = new SQLNonTransientException();
throw ex;
}
ex1()에서 java.sql.SQLException 오류가 발생합니다.
첫 번째 코드가 성공하고 IllegalStateException 오류가 잡히고 로그가 남으므로 두 번째 코드도 성공해야 한다고 생각합니다.
SQLNonTransientException은 SQLException의 하위 예외이므로 IllegalStateException은 RuntimeException의 하위 클래스이기 때문입니다.
런타임 에러일 때 에러가 발생하면 지정된 하위 에러로 잡을 수 있는데 Check예외인 SQLException의 경우에는 적용되지 않는 이유를 알고 싶습니다.
답변 1
1
안녕하세요, 조시현 님. 공식 서포터즈 y2gcoder 입니다.
제가 조시현님께서 궁금해하시는 바를 정확하게 이해했는지 모르겠습니다.
혹시 두 테스트 코드에서
b()에서는 아무런 에러가 뜨지 않는데 a()에서는 try-catch로 ex1()를 잡아줘도 SQLException을 처리해주라는 컴파일 에러가 뜨는 것 때문에 질문 주신 것일까요?
해당 에러는 체크 예외와 언체크 예외(이하 런타임 예외)의 차이점 때문에 발생하는 것입니다. 아시다시피 체크 예외는 컴파일러가 예외 처리를 확인하고 강제하는 예외입니다. 반면에 런타임 예외는 예외 처리를 강제하지 않는 예외입니다.
이 점을 기억하고 보시면 ex2()에서는 throws에서 런타임 예외인 RuntimeException을 throws절로 호출하는 메서드에 전달하고 있고, ex1()에서는 체크 예외인 SQLException을 throws절에서 호출하고 있습니다.
ex2()를 호출한 b()에서는 ex2()의 throws절의 예외가 런타임 예외이기 때문에 컴파일러에서 강제로 예외를 처리하라고 하지 않습니다. 그래서 에러가 발생하지 않습니다. 반면 ex1()를 호출한 a()에서는 ex1()가 throws절에 체크 예외인 SQLException을 명시했기 때문에 이를 호출한 a()에서 SQLException에 대해 try-catch 문으로 처리를 해주거나 a()에서도 throws 절을 이용해 해당 예외를 전달해주는 등의 처리가 강제됩니다. 그래서 ex1()의 throws절을 SQLNonTransientException으로 바꿔주면 해당 컴파일 에러가 사라지게 됩니다.
감사합니다.
0
b()에서는 RuntimeException으로 에러를 던져줬음에도 불구하고 runtimeException의 하위에러이자 참조하고 있는 객체인 IllegalStateException로 예외를 잡아서 log를 나타내주는데
a()의 경우에는 SQLException의 하위에러이자 참조하고 있는 객체인 SQLNonTransientException로 왜 잡아주지 못하고 SQLException으로 잡아줘야하는지 궁금했습니다.
질문이 불친절해서 죄송합니다 ㅠㅠ
1
아닙니다. ㅎㅎ
그리고 밑의 질문에 대한 답이 이것입니다. ex1()의 throws절에 SQLException이라 명시했기 때문에 이를 호출하는 a()에서 해당 에러도 잡아줘야 한다고 컴파일러가 강제하는 것이 원인입니다. 체크 예외기 때문에 컴파일러가 throws 절에 있는 SQLException도 처리하라고 하는 것입니다.
제가 위의 답변을 너무 장황하게 드린 것 같아 죄송합니다.
spring initialiser 어떤걸 선택해야될지 모르겠어요
0
33
2
트랜잭션 템플릿이 체크예외는 커밋하는 이유가 궁금합니다.
0
51
1
jdbc 학습하다 궁금해서 질문드려요
0
84
1
정상이체와 이체중 예외발생 차이
0
68
2
이번 강의부터가 JDBC 직접 사용 맞나요?
0
89
1
순수한 서비스 계층에 대한 의문???
0
82
2
3_4test, 4test 자동 리소스 안됨
0
59
2
데이터베이스 선택 관련 질문.
0
68
2
after 메서드 사용 유무
0
57
2
데이터베이스 접근 및 DB 락
0
55
1
@SpingBootTest, @TestConfiguration
0
57
1
Read Committed 격리 수준 사용 관련 질문
0
49
1
AopCheck Test 부분의 EnhancerBySpring 확인 법??
0
66
2
커리큘럼 관련 질문
0
76
1
서비서 계층 스프링 프레임워크 사용
0
88
1
validation(toMember)의 위치
0
83
2
데이터 계층에서 서비스 로직의 datasource를 인식하는 방법
0
165
2
member 상수 질문
0
122
2
ctrl + F6 이후로 con 인식이 안 됩니다
0
154
2
DrivenManager 와 Connection 반환에 대한 질문입니다!
0
110
1
섹션5 트랜잭션 템플릿관련 질문(이기종 DB)
0
116
1
세션1 테이블 조회결과 그림은 Redo 로그에 속하나요?
0
100
1
트랜잭션이 필요하지 않은 경우 DB 대신 파일 시스템을 사용하는 것이 더 효율적인가?
0
98
1
강의 14분쯤 Exception 질문
0
115
2





