프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정삭적으로 종료되는 경우를 에러 또는 오류라고 한다.
에러
컴파일 에러 : 컴파일 시에 발생하는 에러 (가장 좋은 에러)
런타임 에러 : 실행 시에 발생하는 에러
논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것
컴파일 에러는 컴파일러가 소스코드에 대해 오타나 잘못된 구문, 자료형 체크 등 기본적인 검사를 수행 한다.
컴파일러가 기본적인 사항은 걸러줄 수 있지만, 실행 시 발생할 잠재적인 오류까지 잡아줄 수는 없다.
자바에서는 실행 시 발생할 수 있는 프로그램 오류를 '에러'와 '예외' 두가지로 구분한다.
에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외 : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
자바에서 실행 시 발생할 수 있는 오류를 클래스로 정의하였다.
모든 예외의 최고 조상은 Exception 클래스이며, 상속 계층도를 Exception 부터 살펴보자면 아래와 같다.
위 상속 계층도의 파란색 블럭의 클래스들과 이 외의 클래스는 차이가 있다.
Exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
(ArrayIndexOutof..., NullPointer..., Arithmetic...)
RuntimeException 클래스들 : 프로그래머의 실수로 발생하는 예외
(FileNotFound..., ClassNotFound..., DataFormat...)
printStackTrace()
: 예외 발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메세지를 화면에 출력함
getMessage()
: 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다.
키워드 throw
를 사용해서 고의적으로 예외를 발생시킬 수 있다.
new Exception(String)
으로 새로운 예외 클래스 객체를 만들고 throw
연산자로 던진다.
생성자에 String을 넣어 주면, 이 String이 Exception 인스턴스에 메세지로 저장된다.
이 메세지가 getMessage()
로 읽어들이는 메세지이다.
예외를 메서드에 선언할 수도 있다.
메서드에 예외를 선언하려면, 메서드의 선언부에 throws
를 사용해서 메서드 내에서 발생할 수 있는 예외를 적어주면 된다. 쉼표',' 를 통해 여러개의 예외를 선언할 수 도 있다.
void method() throws Exception1, Exception2, Exception3 { }
만일 최고 조상인 Exception 클래스를 선언하면, 모든 종류의 Exception을 제외하게 된다.
앞서 오버라이딩에서 살펴본 것과 같이, 오버라이딩할 때는 단순히 선언된 예외의 개수가 아니라 상속관계까지 고려해야한다.
프로그래머가 새로운 예외 클래스를 정의하여 사용할 수 있다.
class MyException extends Exception {
MyException(String msg) {
super(msg);
}
}
Exception 클래스로부터 상속받아 만들었다.
필요하다면, 멤버 변수나 메서드를 추가할 수 있다.
Exception 클래스는 생성 시에 String값을 받아서 메세지로 저장할 수 있다.
사용자 정의 예외 클래스도 메세지를 저장하려면, String을 매개변수로 가진 생성자를 추가해야한다.
이번 장은 좀 가볍게 읽고 넘어간 경향이 크다.
아직 예외처리는 내공이 부족한 것같다.
예외처리야 말로 경험치가 쌓여야할테니 반드시 추후에 다시 읽자