Programing Language/Java

[Java] 예외 전가(Exception Imputation)

vinedpillar 2022. 7. 14. 00:48

예외 전가(Exception Imputation)

  • 메서드 내부에서 예외가 발생하면 예외 처리문(try~catch)을 이용하는 것이 기본이지만, 메서드를 호출한 곳으로 예외를 넘길 수도 있습니다.

  • 이를 위해 'throws' 예약어를 사용하는데, 'throws'는 메서드 선언부 끝에 선언되어 넘길 예외 클래스를 지정할 수 있습니다.

  • 여러 개의 예외 클래스가 필요하다면 쉼표(,)를 통해 연결하여 표시할 수 있습니다.
메서드 예외 처리를 위한 throws 사용 방법

반환자료형 메서드이름(매개변수 ... ) throws 예외클래스1, 예외클래스2 {
    메서드 내용 ...
}

 

  • throws를 통해 전가되는 예외는 처리가 되지 않은 상태이기 때문에 메서드를 호출하는 곳에서 예외를 받아서 처리해줘야 합니다.

  • 처리해야할 예외가 많은 경우 최상위 예외 클래스인 Exception이나 예외 인터페이스 Throwable으로 모든 예외를 넘길 수 있습니다.

  • 만약 가장 먼저 실행되는 main메서드에 throws가 있다면 예외 처리를 JVM이 하게 되며, JVM은 콘솔에 예외 내용을 출력해주는 것으로 예외를 처리해 줍니다.
예외 전가 활용 예시

public class ThrowsExample {
    public static void main(String[] args) {
        try {
            // 메서드 호출
            findClass();
        }
        // 메서드에서 보낸 예외를 처리
        catch(ClassNotFoundExcrption e) {
            System.out.println("예외 처리: " + e.toString());
        }
    }
    
    public static void findClass() throws ClassNotFoundException {
    	Class.forName("java.lang.String2");
    }
}

 

 

사용자 정의 예외

  • 프로그램은 사용 목적에 따라 다양한 로직을 처리해야 하는데, 라이브러리가 잘 만들어져도 모든 상황에 대한 예외를 만들어 두는 것은 불가능합니다.

  • 그래서 사용자(프로그래머)가 직접 예외를 정의해서 사용할 수 있는 기능을 지원합니다.

  • 예외를 정의하기 위해서는 일반 예외의 경우 Exception 클래스를, 실행 예외는 RuntimeException을 상속 받습니다.

  • 사용자 정의 예외 클래스에는 기본 컨스트럭터와 예외 메시지를 입력받는 컨스트럭터가 필요합니다.
    (예외 메서드를 출력하는 공통 메서드인 getMessage()를 처리하기 위해 필요)

  • 사용자 정의 예외 클래스를 활용하기 위해서는 메서드 내에서 예외 처리문을 활용하는 방법과 메서드 선언부에서 지정하는 방법 두 가지가 있습니다.
    • 예외 처리문을 활용하는 경우 throw 예약어를 통해 사용자 정의 예외 클래스로 보내서 처리합니다.
    • 메서드를 호출한 곳에서 처리하는 경우는 throws 예약어를 통해 사용자 정의 예외 클래스로 보내 처리합니다.
  • 예외의 원인 메시지를 제공하고 싶다면 생성자의 컨스트럭터의 피라미터 값으로 넣어주면 됩니다.
사용자 정의 예외 처리 방법

// 메서드 내에서 처리하는 방법
접근제어자 반환자료형 메서드이름(매개변수 ... ) {
    try {
    	...
        // 사용자 정의 예외 클래스
        throw new 사용자정의예외클래스("예외 메세지");
        ...
    }
    // 사용자 정의 예외 클래스
    catch(사용자정의예외클래스 변수) {
    	String message = 변수.getMessage();
    }
}

// 메서드 선언부에서 처리하는 방법
접근제어자 반환자료형 메서드이름(매개변수 ... ) throws 사용자정의예외처리클리스 {
   ...
   throw new 사용자정의예외처리클래스("예외 메세지");
   ...
}
사용자 정의 예외 사용 예시

// 예금 관리 프로그램 중 예금 잔액보다 출금액이 클 경우 예외를 발생하는 코드
// 사용자 정의 예외 클래스 선언
public class InsufficientException extends Exception {
    // 기본 컨스트럭터 생성
    public InsufficientException() {
    
    }
    
    // 메시지가 있는 컨스트럭터 생성
    public InsufficientException(String message) {
        super(message);
    }
}

// 은행 계좌 관련 클래스 생성
public class Account {
    private long balance;
    
    public Account() {
    
    }
    
    public long getBalance() {
    	return balance;
    }
    
    public void deposit(int money) {
        balance += money;
    }
    
    public void withdraw(int money) throws InsufficientException {
        if(balance < money) {
            throw new InsufficientException("잔고 부족: " + (money - balance) + " 모자랍니다.");
        }
        
        balance -= money;
    }
}

// 실행 클래스
public class AccountExample {
    public static void main(String[] args) {
        Account account = new Account();
        
        // 예금
        account.deposit(100000);
        System.out.println("예금액: " + account.getBalance());
        
        // 출금
        try {
            account.withdraw(300000);
        }
        catch(InsufficientException e) {
            String message = e.getMessage();
            System.out.println(message);
        }
    }
}