프로그램이 실행 중일때 오작동을 하거나 비정상적으로 종료되는 경우가 있는데, 이때 원인을 에러 또는 오류라고 한다. 오류가 발생하는 시점에 따라 컴파일 에러(compile-time error) 와 런타임 에러(runtime error) 로 나누어 진다. 말 그대로 컴파일 에러는 캄파일 할 때 발생한 에러이며, 런타임 에러는 프로그램의 실행 도중에 발생한 에러를 말한다. 이외에도 논리적 에러(logical error) 도 있는데, 이것은 컴파일과 실행은 잘 되지만 의도한 것과 다르게 동작하는 것을 말한다. 예를 들어 코딩 테스트를 칠 때 실행은 되지만 문제의 설명과는 다른 output이 나온 것과 같다.
- 컴파일 에러 - 컴파일 시에 발생하는 에러
- 런타임 에러 - 실행 시에 발생하는 에러
- 논리적 에러 - 실행은 되지만, 의도와 다르게 동작하는 것
컴파일 에러는 컴파일러가 모두 걸러주며, 자바에서는 실행 시(runtime) 발생할 수 있는 프로그램 오류를 에러(error)와 예외(exception), 두 가지로 구분한다.
에러는 메모리 부족(OutOfMemoryError)이나 스택오버플로우(StackOverFlowError)와 같이 한번 발생하면 복구할 수 없고 프로그램을 종료해야하는 심각한 오류다.
예외는 발생하더라도 수습될 수 있는 비교적 덜 심각한 것이다. 즉 프로그래머가 이에 대한 적절한 코드를 미리 잘 작성해 놓으면 프로그램이 비정상적으로 종료하는 것을 막을 수 있다.
런타임 에러 (Runtime error)
- 에러(Error)- 컴파일 시에 발생하는 에러
- 예외(Exception) - 실행 시에 발생하는 에러
자바에서는 오류(Exception과 Error)를 클래스로 정의하였다. 모든 클래스의 조상은 Object 클래스이므로 Exception과 Error 클래스도 역시 Object 클래스의 자손들이다.
📌 예외클래스 계층도
📌 Exception 클래스와 RuntimeException 클래스 중심의 상속계층도
위 그림을 보면 Exception 클래스는 다음과 같이 두 그룹으로 나누어 진다.
1. Exception 클래스와 그 자손들
2. RuntimeException 클래스와 그 자손들
Exception 클래스들(RuntimeException 제외)은 주로 외부의 영향으로 발생할 수 있는 것들로서, 프로그램의 사용자들의 동작에 의해서 발생하는 경우가 많다. 예를 들어 입력한 데이터 형식이 잘못된것(DataFormatException), 존재하지 않는 파일의 이름을 입력하는것(FileNotFoundException)과 같은 경우에 발생한다.
이 Exception을 Checked Exception이라도 한다. Checked Exception의 특징은 반드시 에러 처리를 해야하는 특징(try/catch or throw)을 가지고 있다.
RuntimeException 클래스들은 주로 프로그래머의 실수에 의해서 발생될 수 있는 예외로 자바의 프로그래밍 요소들과 관계가 깊다. 예를 들면, 배열의 범위를 벗어난다던가(ArrayIndexOutOfBoundsException), 값이 null
인 참조변수의 멤버를 호출하려 하는 것(NullPointerException)등 이 있다.
이 Exception을 Unchecked Exception이라도 한다. 이것은 Checked Exception와는 달리 에러 처리를 강제하지 않는다.
예외는 프로그래머가 이에 대한 처리를 미리 해주어야 한다. 이렇게 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것을 예외처리(exception handling) 라고 한다. 예외처리의 목적은 예외의 발생으로 인한 실행 중인 프로그램의 비정상적인 종료를 막고, 정상적인 실행 상태를 유지하는 것이다.
Java의 정석 - 3rd Edition by. 남궁 성