예외 전가(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);
}
}
}
'Programing Language > Java' 카테고리의 다른 글
[Java] 자바의 라이브러리와 모듈(Java Library & Module) (0) | 2022.07.18 |
---|---|
[Java] 자바 패키지(Java Package) (0) | 2022.07.16 |
[Java] 예외 처리(Exception Handling) (0) | 2022.07.13 |
[Java] 프로그램 에러와 예외(Program Error & Exception) (0) | 2022.07.12 |
[Java] 중첩 인터페이스(Nested Interface) (0) | 2022.07.12 |