작성
·
912
2
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
Java 기본 문법을 여쭤보는 것 같지만 궁금합니다ㅜㅜ.
어떻게 부모타입(DataAccessException)으로 throw했는데 자식타입(BadSqlGrammarException)으로 catch할 수 있는 건가요?
이렇게 테스트를 해보았는데, 잡히더라구요. 그래서 catch문에서 자동으로 upcasting이 되는건가 싶어서 RuntimeException이 아닌 Checked Exception으로도 진행을 해보았습니다.
하지만 컴파일 에러가 발생하더라구요ㅜㅜ.
RuntimeException만 upcasting을 해주는 건지, 아니라면 어떻게 자식타입으로 catch할 수 있는건지 궁금합니다!
답변 3
2
우선 업케스팅은 둘다 자동으로 되는거 같고
컴파일 에러 관련해서 저도 궁금해서 여러 군데 찾아봤지만 정확한 답인지는 모르겠지만 chatGPT에게 물어봤을때, 런타임예외가 아닌 Exception을 던졌을때, 명시적으로 잡아주지 않으면 컴파일 에러가 나타난다고 하네요.
아마 컴파일 에러가 아니라면 로직상 SQLException도 잡아주지 않았을까 싶습니다.
참고로 Java 언어의 예외 처리 관련 공식 문서와 Java 11 버전에서의 예외 처리 규칙을 기반으로 작성되었다고 합니다.
정확한 답변 아시는 분 댓글 부탁드립니다 ㅜㅜ
어떻게 부모타입(DataAccessException)으로 throw했는데 자식타입(BadSqlGrammarException)으로 catch할 수 있는 건가요?
-> 결국 스프링에서 추상화 한 예외는 모두 RuntimeException
을 상속받기 때문에 잡아서 처리하는 것이 강제되지 않습니다. DataAccessException
의 자식인 BadSqlGrammarException
에 대한 catch
만 처리하더라도, 잡지 못하는 나머지 자식들에 대해서는 런타임에 자동으로 밖으로 던져주기 때문에 컴파일 에러가 발생하지 않습니다. 런타임 예외는 애초에 컴파일러가 체크하는 대상이 아닙니다.
1
ex()
메서드에서throws Exception
으로 명시해준 것이 문제 원인입니다.Exception
은 자바 애플리케이션에서 발생할 수 있는 모든 예외의 부모입니다. 즉, 체크 예외도 던져질 수 있음을 의미합니다.따라서
ex()
를 호출하는 곳에서는 체크 예외에 대한 처리도 해줘야 되는데, 현재 그렇지 않으니 컴파일 에러가 발생합니다(체크 예외에 대한 처리는 컴파일러가 체크).다음 세 경우에는 문제가 발생하지 않습니다.
call_ex()
에서catch (Exception e) { ... }
를 추가ex()
에서throws IllegalArgumentException
으로 명시ex()
에서throws
를 명시하지 않음관련해서 블로그 포스팅을 작성해두었으니, 관심있으시면 확인해보세요!
https://hyoyoonnam.github.io/posts/throw-runtime-exception-with-throws-Exception/