Ch.08 예외 처리(Exception handling)
- 예외 처리(exception handling)
- 프로그램 오류
- 프로그램이 실행 중에 어떤 원인에 의해 오작동하거나 비정상적으로 종료되는 것을 의미
- 발생시점에 따른 오류 분류
- 컴파일 에러: 컴파일 시에 발생하는 에러
- 런타임 에러: 실행 시에 발생하는 에러
- 논리적 에러: 실행은 되지만, 의도와는 다르게 동작하는 것
- 에러(error): 프로그램 코드에 의해 수습될 수 없는 심각한 오류
- 예외(Exception): 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 부분
- 예외 클래스의 계층 구조
- 예외의 최고 조상: Exception 클래스
- IOException //입출력 예외
- ClassNotFoundException //클래스 파일 예외
- RuntimeException
- ArithmeticException //정수를 0으로 나눌 때
- ClassCastException //참조변수의 형변환 할 때
- NullPointException //null인 참조변수의 멤버를 호출하려고 할 때
- IndexOutOfBoundsException //배열의 인덱스 범위를 벗어날 떄
- Exception의 두 종류
- Exception 클래스와 그 자손들(RuntimeException 제외)
- 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
- 예외 처리 필수(checked)
- RunTimeException 클래스와 그 자손들
- 프로그래머의 실수와 같은 외적인 요인에 발생하는 예외
- 예외 처리 선택(unchecked)
- Exception 클래스와 그 자손들(RuntimeException 제외)
- 예외의 최고 조상: Exception 클래스
- 예외 처리하기 – try-catch
- 정의: 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
- 목적: 프로그램의 비정상적인 종료를 막고, 정상적인 실행 상태를 유지하는 것
- 발생한 예외를 처리하지 못하면 JVM의 예외처리기(UncaughtExceptionHandler)가 받아서 예외의 원인을 화면에 출력
- Try-catch문에서의 흐름
- try블럭 내에서 예외가 발생한 경우
- 발생한 예외와 일치하는 catch블럭이 있는지 아래서부터 순차적으로 확인
- 일치하는 catch블럭을 찾으면 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행
- 만약 예외 발생 후 일치하는 catch블럭을 찾지 못하면 예외 처리는 수행되지 않음
- try블럭 내에서 예외가 발생하지 않은 경우
- try블럭을 마무리하고 try-catch문을 빠져나가 이어서 다음 문장을 수행
- try블럭 내에서 예외가 발생한 경우
- 예외 발생과 catch블럭
- printStackTrace() //예외 당시의 호출 스택(Call Stack)에 있었던 메서드의 정보와 예외 메세지를 화면에 출력
- getMessage() //발생한 예외 클래스의 인스턴스에 저장된 메세지를 얻을 수 있음
- 멀티 catch 블럭
- 하나의 catch블럭으로 예외를 묶는 방법
- '|' 로 catch 블럭에 예외를 연결해서 선언
- 연결 개수에는 제한이 없음
- '|'기호로 연결된 예외들이 부모와 자손의 관계에 있다면 컴파일 에러 발생 → 조상 클래스만 쓰는 것과 같은 의미
- 예외 발생시키기
- 키워드: throw
- 연산자 new를 이용해서 발생시키려는 예외 클래스를 선언
- 인스턴스를 생성할 때, 생성자에 String을 넣어 정보를 전달하면 예외를 발생시켰을 때 getMessage()를 통해 얻을 수 있음
- throw를 이용해서 예외를 발생
- 연산자 new를 이용해서 발생시키려는 예외 클래스를 선언
- 키워드: throw
- 메서드에 예외 선언하기
- 키워드: throws
- void method throws Exception { //메서드의 내용 } //메서드 안에서 발생시킬 수 있는 예외
- 예외가 선언된 메서드를 호출할 때는 예외 처리를 해야한다는 의미
- finally 블록
- try-catch문의 예외 처리 발생과 상관 없이 실행되어야하는 코드를 포함 시킴
- try { //예외 확인할 내용 } catch (Exception e) { //예외가 발생했을 경우 } finally { //발생여부와 상관없이 항상 수행 }
- 자동 자원 변환 – try-with-resource
- 입출력(I/O)과 관련된 클래스를 사용할 때 유용
- 입출력은 사용 후 닫아줘야 자원(resource)을 반환하기 때문
- try-catch문을 개선한 것
- try의 괄호()안에 객체를 생성하는 문장을 넣으면 try문을 벗어나는 순간 자동으로 close()를 호출
- 자동으로 호출하기 위해 interface AutoCloseable을 구현한 것이여야함
- 사용자정의 예외 만들기
- 기존의 예외 클래스를 상속(extends)받아서 새로운 예외 클래스를 정의 가능
- 예외 처리 필수인 Exception보다 예외 처리 선택인 RuntimeException을 사용하는 것을 권장
- 예외 되던지기(exception re-throwing)
- 의미: 예외를 처리한 후에 인위적으로 다시 발생시키는 것
- 사용 이유: 하나의 예외에 대해서 예외가 발생한 곳과 호출한 곳 양쪽에서 처리해야 하는 경우
- try-catch문의 catch문에서 throw를 통해 예외를 재발생
- 연결된 예외(chained exception)
- 한 예외가 다른 예외를 발생시키는 것
- 예외 A가 예외 B를 발생킴 → A를 B의 원인예외(cause Exception)라고 정의
- 사용 이유
- 여러가지 예외를 하나의 큰 예외로 다루기 위해
- 조상 예외를 catch문에 작성하면 조상 예외 발생인지 자손 예외 발생인지 구분할 수 없기 때문에
- 예외 처리 필수를 예외 처리 선택으로 변환하기 위해
- RuntimeException(Trowable casue)
- 원인 예외를 등록하는 생성자
- RuntimeException으로 원인 예외를 감쌌기 때문에 예외 선택 처리가 됨
- 한 예외가 다른 예외를 발생시키는 것
'JAVA 기초' 카테고리의 다른 글
[JAVA 기초] JAVA의 정석 - Ch.10 날짜와 시간 & 형식화 (정리) (4) | 2025.01.17 |
---|---|
[JAVA 기초] JAVA의 정석 - Ch.09 Java.lang 패키지와 유용한 클래스 (정리) (2) | 2025.01.16 |
[JAVA 기초] JAVA의 정석 - Ch.07 객체지향 프로그래밍 II (정리) (1) | 2025.01.15 |
[JAVA 기초] JAVA의 정석 - Ch.06 객체지향 프로그래밍 I (정리) (1) | 2025.01.15 |
[JAVA 기초] JAVA의 정석 - Ch.05 배열(Array) (정리) (2) | 2025.01.15 |