오류 및 예외
- 사용자가 숫자가 아닌 문자를 입력한다거나
개발한 프로그램이 감당할 수 없는 숫자가 입력된다거나
프로그램을 돌리는 컴퓨터에 메모리가 부족하는 등
오류 및 예외사항 처리보다 구현에 집중하는 주니어 개발자
- 반복되면 습관이 된다
- 실제 데이터를 다루고 프로젝트를 할 때 이러한 처리를 잘 못하면 큰 문제가 생긴다.
오류
- 일반적으로 회복이 불가능한 문제
- 시스템레벨, 환경적인 요인으로 발생
- 코드의 문제일 경우 심각함
- 에러가 발생한 경우 어떠한 에러로 프로그램이 종료되었는지를 확인하고 대응
예외
- 일반적으로 회복이 가능한 문제
- 예외가 발생할 수 있다는 것을 인지하고 대응할 수 있다. (처리 로직을 심는다.)
- 현실적으로 코드레벨에서 할 수 있는 문제상황에 대한 대응은 '예외처리'에 속한다.
컴파일 에러(예외)
- .java 파일을 .class 파일로 컴파일할때 발생하는 에러
- 대부분 문법을 틀려서 발생
- 문법에 맞게 다시 작성
런타임 에러(예외)
- 주로 다루게 될 에러
- 문법적인 오류가 아니다. 컴파일은 잘 되었지만 "프로그램"이 실행도중 맞닥뜨리게 되는 예외
예외처리 관점에서 예외의 종류
예외처리의 흐름
- 우리가 예외를 어떻게 정의
- 예외가 발생할 수 있음을 알리고
- 사용자는 예외가 발생할 수 있음을 알고 예외를 핸들링 하는지
throws
- 메서드 이름 뒤에 붙어 이 메서드가 어떠한 예외사항을 던질 수 있는지 알려주는 예약어
- 그냥 Exception과 다르게 여러 종류의 예외사항을 적을 수 있다.
throw
- 메서드 안에서, 실제로 예외 객체를 던질 때 사용하는 예약어
- 실제로 던지는 예외 객체 하나와 같이 써야한다.
- 일반 메서드의 return 키워드처럼 throw 아래의 구문들은 실행되지 않고, throw문과 함께 메서드 종료
위험하다고 표시해놓고 그냥 호출하면 안된다.
- 예외처리 로직에 따라 해야한다
- try ~ catch ~ finally 구문
예외 클래스 구조 이해하기
자바의 Throwable Class
- 시작은 모든 객체의 원형인 Object클래스에서 시작
- "문제 상황"을 뜻하는 Throwable 클래스가 Object 클래스를 상속한다.
- Throwable 클래스의 자식으로 오류(Error)와 예외(Exception) 클래스가 있다.
- 에러 클래스와 예외 클래스는 각각 IOError 클래스, RuntimeException 클래스와 같이 구분하여 처리된다.
Chained Exception, 실제 예외 처리하는 방법
연결된 예외
- 예외는 다른 예외를 유발할 수 있다.
- 예외 A가 예외 B를 발생시켰다면, 예외 A는 B의 원인 예외입니다.
- 원인 예외를 새로운 예외에 등록한 후 다시 새로운 예외를 발생시키는데, 이를 예외 연결이라고 한다.
예외를 연결하는 이유
- 여러 가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위함
- checked exception을 unchecked exception으로 포장(wrapping)하는데 유용하게 사용되기도 함
원인 예외를 다루기 위한 메서드
initCause()
getCause()
예외를 처리하는 방법
- 복구
- 기본적인 방식이지만, 현실적으로 복구가 불가능한 상황이 많거나 최소한의 대응만 가능한 경우가 많아 자주 사용되지 않는다.
-
처리 회피
-
전환
리스트는 인터페이스이다.
public interface List extends Collection {
ArrayList는 구현체이다.
리스트, 큐, 셋 등에서 상속받은 구현체들과의 관계 개념을 알고 사용하자.