프로그램 오류
- 컴파일 에러: 컴파일 시에 발생하는 에러
- 런타임 에러: 실행 시에 발생하는 에러
- 논리적 에러: 실행은 되지만, 의도와는 다르게 동작하는 것.
- 에러(Error): 프로그램 코드로 수습될 수 없는 심각한 오류
- 예외(Exception): 프로그램 코드로 수습될 수 있는 미약한 오류
예외 클래스의 계층 구조
- 모든 클래스의 조상은 Object클래스이므로 Exception과 Error클래스 역시 Object클래스의 자손들이다.
- 모든 예외의 최고 조상은 Exception이다.
- 예외 클래스들은 두 그룹으로 나눠 진다.
- Exception클래스와 그 자손들 (checked)
- 외적인 요인에 의해 발생하는 예외
- 컴파일러가 예외처리를 확인하지 않는다.
- RuntimeException클래스와 그 자손들 (unchecked)
- 프로그래머의 실수로 발생하는 예외
- 컴파일러가 예외처리를 확인한다.
예외처리
- 정의: 프로그램 실행시 발생할 수 있는 예외에 대비한 코드를 작성하는 것
- 목적: 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
try-catch문에서의 흐름
- try블럭 내에서 예외가 발생한 경우
- 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.
- 일치하는 catch블럭을 찾게 되면, 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다.
만약 일치하는 catch블럭을 찾지 못하면, 예외가 처리되지 못한다.
- try블럭 내에서 예외가 발생하지 않은 경우
- catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.
try {
} catch (/* 처리하고자 하는 예외를 포함하는 범위의 참조변수 */) {
/* 예외 발생 시 실행할 코드 */
}
printStackTrace()와 getMessage()
- printStackTrace(): 예외발생 당시에 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
- getMessage(): 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.