error : 프로그램코드에 의해서 수습될 수 없는 심각한 오류
컴파일에러 : 컴파일시 발생하는 에러
런타임에러 : 프로그램의 실행시 발생하는 에러
논리적에러 : 실행은 되지만 의도와 다르게 동작하는 것
예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 미약한 오류
Exception클래스들 : 외부의 영향. 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
예외처리를 하지 않으면 컴파일조차 되지 않는다.
RuntimeException클래스들 : 프로그래머의 실수로 발생하는 예외. 예외처리를 하지 않아도 컴파일은 되지만 비정상적으로 종료된다.
예외처리(Exception Handling): 예외의 발생에 대비한 코드를 작성하는 것.
프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하기 위해 한다.
try {
// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (ExceptionN eN) {
// ExceptionN이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
...
}
try블럭 내에서 예외가 발생한 경우, 발생한 예외의 종류와 일치하는 단 한개의 catch 블럭만 수행된다. 일치하는 catch 블럭이 없으면 예외는 처리되지 못한다.
try블럭 내에서 예외가 발생하지 않은 경우 그대로 빠져나간다.
|
를 통해 catch (Exception1 e1 | Exception2 e2)
처럼 여러 catch블럭을 합칠 수 있다.
catch블럭은 ()와 {} 두부분으로 나눠져있는데, ()내에는 처리하고자하는 예외와 같은 타입의 참조변수 하나를 선언해야 한다.
ArithmeticException : n/0과 같은 산술적인 예외일 때
Exception : 모든 예외클래스는 Exception클래스의 자손이므로 Exception클래스 타입의 참조변수를 선언하면 어떤 종류의 예외가 발생해도 여기서 처리된다.
void method() throws Exception1, Exception2, ... ExceptionN {
// 메서드의 내용
}
예외가 발생했을 때 생성되는 예외클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨있다.
printStackTrace() : 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외메세지를 화면에 출력한다.
getMassage() : 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다.
Exception e = new Exception("고의로 발생시켰음");
throw e;
throw new Exception("고의로 발생시켰음"); // 으로 위의 2줄을 한줄로 줄여 쓸 수도 있다.
필요에 따라 프로그래머가 알맞은 예외 클래스를 상속받아 새로운 예외 클래스를 정의해 사용할 수 있다.
예외 되던지기 : 예외를 처리하고 필요한 작업을 행한 후에 throw문을 통해 다시 예외를 발생시킬 수 있다.
하나의 예외에 대해 예외가 발생한 메서드와 이를 호출한 메서드 양쪽 모두에 처리해줘야 할 작업이 있을 때 사용된다.
한 예외가 다른 예외를 발생시킬 수도 있다. 이때 원인이 되는 예외를 원인예외(cause exception)라 한다.