프로그램 실행 중에 예기치 못한 상황에서 발생하는 비정상적인 상황을 가리킨다. 문법에 맞지 않게 작성된 코드는 사전에 컴파일 오류로 걸러지지만, 런타임 에러는 실행중에 발생한다. 이러한 예외가 발생한 경우 프로그램의 비정상적인 종료 대신 계속해서 정상적인 수행을 할 수 있도록 처리하는 것을 예외 처리라고 한다.
이러한 처리의 장점으로는 코드 상에서 정상 상태와 예외 상태를 명로하게 구분 가능하고, 예외가 발생한 이후의 코드에 대해 신경 쓸 필요가 줄어든다.
자바는 모든 것이 객체이기 때문에 예외 역시 하나의 객체로 표현된다. 일반 객체처럼 클래스를 이용하여 정의되어 사용 가능하다.
예외를 나타내는데 사용되는 클래스로 java.lang.Throwable 로부터 파생된 클래스이다. 생성자, 멤버 필드, 메서드 등을 가질 수 있으며, 일반 객체와 차이점은 throws 할 수 있다는 점이다.
상대적으로 덜 심각한 예외를 표현하며, 보통 ‘예외’라고 부르는 예외 처리 대상이다.
Throwable 클래스의 멤버 메서드로 표시한다.
예외 처리 방법에는 두 가지가 있는데, 첫번째 방법은 try ~ catch문을 사용하는 것이고 두번째 방법은 throws문으로 예외를 호출측으로 던지는 것이다.
예외 발생시 catch 문에서 처리하며, 여러개의 catch문이 있는 경우 위에서부터 순서대로 처리되며, 상대적으로 상위 예외 클래스형의 객체를 더 나중에 검사하도록 해야 한다.
finally 블록은 예외 발생여부와 상관없이 무조건 실행되는 것으로, 생략해도 상관없으며 실제 많은 경우 생략한다.
메서드 구현부에 기술하며, 예외 발생시 예외 처리를 현재 메서드를 호출한 곳으로 던진다. 메서드 호출의 역순으로 예외가 처리될 때까지 전달되며, 호출 측에서 try-catch문을 통해 처리해 줘야 한다.
throw 키워드는 자바에서 예외를 명시적으로 발생시키는 데 사용하는 것으로 new 키워드와 함께 사용하여 특정 객체를 생성하고 이를 프로그램 흐름에서 던질 수 있다. 이를 통해 예외를 강제시킬 수 있다.
// 사용자 정의 예외 클래스
class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}
public class ThrowNewCustomException {
public static void main(String[] args) {
try {
validateScore(-10); // 예외 발생
} catch (CustomException e) {
System.out.println("예외 처리: " + e.getMessage());
}
}
public static void validateScore(int score) throws CustomException {
if (score < 0) {
// 사용자 정의 예외를 명시적으로 던짐
throw new CustomException("점수는 0 이상이어야 합니다.");
}
System.out.println("점수가 유효합니다.");
}
}
출처
명품 JAVA programming - 황기태, 김효수
https://www.youtube.com/사람만이