JAVA

[JAVA] 예외처리: 사용자 정의 예외 클래스

정공자씨 2024. 4. 24. 17:26

 

사용자 정의 예외 클래스

정의

  • 사용자가 프로그램에서 특정한 상황이 발생한 경우 예외로 인식하기 위해 만든 클래스
    • 자바에서 제공하지 않는 예외는 사용자가 직접 예외를 만들어서 사용
    • 예를 들어, 체크카드로 결제 시에 체크 카드의 잔고가 남아 있지 않는 경우, 예외를 발생시킴
  • 일반 예외의 경우 Exception 클래스를 상속받고
  • 실행 예외인 경우는 RuntimeException 클래스를 상속 받아서 만듦

 

특징

  • 사용자 정의 예외는 특정한 예외를 처리하기 위한 용도이므로
  • 예외가 발생하는 경우에
    • 사용자 정의 예외 클래스의 생성자로 예외에 대한 메시지를 전달한 후에
    • try/catch문에서 처리하는 게 일반적
  • 사용자 정의 예외클래스는 반드시 Exception 클래스를 상속 받아야 함

 

형식

public class UserDefinedException extends Exception {  // Exception클래스 상속
    public UserDefinedException() { }  // 기본생성자

    public UserDefinedException(String mesg) { // 매개변수 있는 생성자
        super(mesg);
    }
}

 

 

예제

1. 사용자 정의 예외 클래스

  • 사용자 정의 예외클래스는 반드시 Exception 클래스를 상속 받아야 함
// 사용자 정의 예외클래스는 반드시 Exception 클래스를 상속 받아야 함
class UserDefinedException extends Exception {

    public UserDefinedException(String mesg) { // 예외가 발생하면, 생성자로 예외 메시지 전달
        super(mesg);  // 상위 클래스의 생성자에게 에러메시지 전달
        System.out.println("사용자 정의 예외 클래스의 생성자 호출");
    }    
    
}

 

public class ScoreTest {	
    static int checkScore(int score) throws UserDefinedException {    
        if(score <= 0 || 100 <= score) {
            // 범위를 벗어나는 값을 입력했을 때, 생성자를 이용하여 사용자 정의 예외를 발생
            throw new UserDefinedException("정확한 점수를 입력하세요!");  
        }		
        return score;
    }

    public static void main(String[] args) {		
        int score = -10;

        try {
            score = checkScore(score);            
            // 정상적인 값이 입력됐을 때에 아래 출력문이 출력됨
            System.out.println("입력한 점수는 " + score + "입니다.");
        } catch (UserDefinedException e) {
            e.printStackTrace();
        }
        System.out.println("프로그램 종료! ");		
    }
}
  • throws UserDefinedException
    • 예외가 발생하면, 예외를 호출한 곳으로 예외를 떠넘김
  • e.printStackTrace(); 
    • 생성자로 보낸 오류 발생 메시지가 출력됨

 

 

[ 실행 결과 ]

  • checkScore() 메서드를 수행하면, score가 -10이므로 if문 조건의 범위 값을 벗어났기 때문에
  • 생성자를 이용 → 사용자 정의 예외 클래스(UserDefinedException)의 객체를 생성하여 예외 발생시킴
  • throws UserDefinedExceptio은 예외 발생 시에, 예외를 호출한 곳으로 예외를 다시 넘기라는 뜻이므로
    • 예외를 호출했던 checkScore(score)로 가고
    • 예외가 발생하였으므로, 아래 출력문("입력한 점수는 ~입니다")는 출력되지 않음 
  • 이 예외를 catch 블럭이 잡아서 e.printStackTrace() 메서드를 실행함