학습 목표
- 자바의 예외 처리
학습 결과 요약
- 프로그램에서 오류는 발생 시점에 따라서 컴파일 에러 런타임 에러로 구분할 수 있다.
- 런타임 에러는 Error, Exception 으로 나누는데 exception 은 코드로 예외 처리가 가능한 오류를 뜻한다.
- 자바에서 예외 처리 방법은 크게 예외 직접 처리, 예외 떠넘기기, 연결된 예외 3가지가 있다.
- 직접 처리는 try-catch 구문으로
- 예외 떠넘기기는 메서드 선언부에 throws 키워드를 사용하고 이 메서드를 호출한 쪽에서 예외처리를 하도록 한다.
- 연결된 예외는 예외 안에 예외를 포함시키는 방법이다.
학습 내용
프로그램에서 오류의 종류
발행 시점에 따라서
- 컴파일 에러
- 런타임 에러
- Error : 프로그램 밖에서 발생하는 문제로 코드로 처리 불가능함
- Exception : 코드로 예외처리 가능함
Exeption 구분
Checked Exception
- 예외 처리를 강제하는 익셉션들
- Exception 하위 클래스 중 RuntimeException 과 이 하위 클래스들을 제외한 모든 클래스
Unchecked Exception
- Runtime Exception 과 하위 클래스들
- 예외 처리 코드가 없어도 컴파일 된다. 예외 처리가 선택적이다.
- 보통 개발자의 버그나
예외 처리 방법
직접 처리
- 직접처리는 예외가 발생한 메서드에서 예외처리를 한다.
예외 처리 구문은 아래와 같다.
try 블럭에서 예외가 발생하면 예외 객체가 생성이 된다.
예외 객체가 생성이 되면 catch 소괄호에 선언된 예외와 일치하는 타입을 순서대로 찾는다.
순서대로 찾기 때문에 상위 예외 → 하위 예외 순으로 catch 를 선언하면 무조건 상위 예외 타입에 일치해버리므로
하위 예외타입의 catch 블록이 실행될 일이 없다.
catch 블록을 여러개 선언할 때는 예외 클래스의 계층을 자식부터 상위로 선언해야 한다.
일치하는 예외 타입을 발견하면 참조 변수에 예외 객체 참조값을 할당한다. 예외 참조변수로 부모 클래스의 메서드를 호출할 수 있다.
예외 떠넘기기
- 예외 떠넘기기는 예외가 발생한 메서드를 호출한 메서드에서 예외 처리를 하도록 만든다.
예외 처리 구문은 throws 와 throw 키워드를 사용한다.
메서드 선언에 throws 키워드 뒤에 발생할 예외 클래스를 나열한다.
사용할 메서드 명세서에 명시된 예외중 Checked Exception 이 있다면 반드시 예외 처리를 해줘야한다.
그렇지 않으면 컴파일 되지 않는다.
연결된 예외
- 한 예외가 다른 예외를 발생시킬 수 있다.
- 사용 이유
- 원인 예외와 또다른 예외를 포함해서 연견된 예외를 만든다. 예외 A가 예외 B 를 발생시키면, A 는 B의 원인 예외
- checked → unchecked 로 바꾸려 할때
- Throwble 클래스는 Exception 과 Error 의 최고 조상 클래스다.
- 연결된 예외 예시
install 메서드에 처리해야 할 예외로 3개를 선언했다.
이 메서드를 호출하는 부분에서는 아래 예외들을 모두 처리해야한다.
install() 을 호출하는 메서드의 코드 가독성이 떨어진다.
그리고 이 메서드에서 Install 행위가 실패했을 경우에 예외 처리를 한다면
아래처럼 디테일한 에러를 알 필요가 없다.
이럴 때 연결된 예외를 사용하면 된다.
SpaceException, MemoryException, IOException 을 install() 메서드 안으로 옮기고 한 개의 익셉션만 받으면 된다.
예외 InstallException 의 원인 예외로 SpaceException 을 설정하고 InstallException 예외를 던진다.
호출하는 코드에서 try-catch 블록 코드가 간결해졌다.
org.flab.chapter14.InstallException: 설치중 예외발생
at org.flab.chapter14.Installer.install(Installer.java:26)
at org.flab.chapter14.Installer.main(Installer.java:14)
Caused by: org.flab.chapter14.SpaceException: 설치 공간 부족
at org.flab.chapter14.Installer.startInstall(Installer.java:38)
예외 로그도 InstallException 의 원인이 SpaceException 이라고 표시해줌으로써 더 세부적인 예외 내용 전달이 가능하다.
- checked → unchecked Exception 예시
예외 처리를 필수에서 선택 처리로 변경할 때 사용한다.
SpaceException 은 checked 익셉션이므로 예외 처리가 필수다.
만알 unchecked 로 변경하고 싶은데 이미 이 예외를 상속하는 하위 클래스가 100개가 넘는다 가정해보자.
상속 계층도 변경은 쉽지 않은 작업이므로 함부로 unchecked 익셉션으로 변경하기 어렵다.
이때 RuntimeException 안에 SpaceException를 포함시켜 RuntimeException 으로 위장하는 방법이 있다.
startInstall() 을 호출하는 쪽에서 SpaceException 처리를 선택적으로 할 수 있다.
예외 처리 전략
자바에 예외를 처리할 때에는 어떤 정답이 없으니 표준을 잡고 진행하는 것이 좋다.
'Programming > Java' 카테고리의 다른 글
[F-lab 모각코 챌린지 17일차] TIL (0) | 2023.06.19 |
---|---|
[F-Lab 모각코 챌린지 16일차] Java : 블랙잭 게임 구현 (0) | 2023.06.18 |
[F-Lab 모각코 챌린지 14일차] Java : 불변객체 (1) | 2023.06.16 |
[F-Lab 모각코 챌린지 13일차] Java : 인터페이스와 추상클래스 (0) | 2023.06.15 |
[F-Lab 모각코 챌린지 11일차] Java : 자바의신 10장-2 (0) | 2023.06.13 |
댓글