프로그램이 실행 중 어떤 원인에 의해 오작동을 하거나 비정상적으로 종료되는 경우가 있다. 이러한 결과를 초래하는 원인을 프로그램 에러 또는 오류라고 한다. 이를 발생시점에 따라 아래와 같이 3가지로 분류할 수 있다.
- 컴파일 에러
컴파일 시 발생하는 에러
- 런타임 에러
실행 시에 발생하는 에러
- 논리적 에러
실행은 되지만, 의도와 다르게 동작하는 것
Runtime Error
컴파일을 에러 없이 성공적으로 마쳤다 해서 프로그램 실행 시에도 에러가 발생하지 않는 것은 아니다. 컴파일러가 실행 도중에 발생할 수 있는 잠재적인 오류까지 검사할 수 없다. 그래서 컴파일은 잘 되었어도 실행 중에 에러에 의해 잘못된 결과를 얻거나 프로그램이 비정상적으로 종료될 수 있다.
이러한 에러를 런타임 에러라 부르며 자바에서는 실행 시 발생할 수 있는 프로그램 오류를 에러(error)와 예외(exception), 두 가지로 구분한다.
- 에러
프로그램 코드에 의해서 수습될 수 없는 심각한 오류
- 예외
프로그램 코드에 의해서 수습될 수 있는 미약한 오류
예외 클래스 계층구조
자바는 런타임 에러를 클래스로 정의하였다.
Error와 Exception 클래스는 모든 클래스의 조상인 Object 클래스의 자손들이다.
모든 예외의 최고 조상은 Exception 클래스이다.
- Exception class (checkd exception)
주로 사용자 동작에 의해서 발생하는 예외이다. 존재하지 않는 파일의 이름을 입력했던가, 입력한 데이터 형식이 잘못된 경우 등에서 발생한다.
- RuntimeException class (uncheckd exception)
주로 프로그래머 실수에 의해서 발생하는 예외이다. 배열 범위를 벗어나던가, 값이 null인 참조변수 멤버를 호출하는 경우 등에서 발생한다.
try-catch
try-with-resources
try-catch-finally 단점
- 자원 반납에 의해 코드가 복잡해짐
- 실수나 에러로 자원을 반납하지 못하는 경우 발생
- 에러 스택 트레이스가 누락되어 디버깅이 어려움
try-with-resources 장점
- 코드를 간결하게 만들 수 있음
- 번거로운 자원 반납 작업을 하지 않아도 됨
- 실수나 에러로 자원 반납을 못하는 경우를 방지할 수 있음
- 모든 에러에 대한 스택 트레이스를 남길 수 있음