Java Category/Java

[JAVA] 사용자 정의 예외

ReBugs 2023. 7. 26.

이 게시글은 이것이 자바다(저자 : 신용권, 임경균)의 책과 동영상 강의를 참고하여 개인적으로 정리하는 글임을 알립니다. 


사용자 정의 예외

사용자 정의 예외란 예를 들어 은행의 뱅킹 프로그램에서 잔고보다 더 많은 출금 요청이 들어온 경우에는 잔고 부족 예외를 발생 시킬 필요가 있다.

하지만 잔고 부족 예외는 자바의 표준 라이브러리에는 존재하지 않기 때문에 직접 예외 클래스를 정의해서 사용해야 한다.

이렇게 사용자가 직접 예외 클래스를 정의하는 것을 사용자 정의 예외 클래스라고 한다.

 

사용자 정의 예외는 일반 예외와 실행 예외로 선언할 수 있다.

  • 일반 예외 : 컴파일러가 체크, Exception의 자식 클래스로 선언
  • 실행 예외 : 컴파일러가 체크하지 않음, RunTimeException의 자식 클래스로 선언
public class XXXException extends [Exception | RunTimeException] { //일반 예외를 상속할지, 실행 예외를 상속할지 선택
	public XXXException() { //기본 생성자
	}

	public XXXException(String message) { //예외 메시지를 입력받는 생성자
		super(message);
	}
}

예외 메시지는 부모 생성자 매개값으로 넘겨주는데, 그 이유는 예외 객체의 공통 메소드인 getMessage()의 리턴 값으로 사용하기 위해서이다.

 


 

예외 발생 시키기

  • 자바에서 제공하는 표준 예외뿐만 아니라 사용자 정의 예외를 직접 코드에서 발생시키려면 throw 키워드와 함께 예외 객체를 제공하면 된다.
  • 예외의 원인에 해당하는 메시지를 제공하고 싶다면 생성자 매개값으로 전달하면 된다.
throws(예외 떠넘기기) 키워드와 thorw(예외 발생시키기) 키워드는 다른 것이니 혼동하지 말자.
  • throw된 예외는 직접 try-catch 문으로 예외를 처리할 수도 있지만, 대부분은 메소드를 호출한 곳에서 예외를 처리하도록 throws 키워드로 예외를 떠넘긴다.

 

아래의 코드는 계좌의 잔고보다 많은 금액을 출금하려고 하면 사용자 정의 예외를 발생시켜서 출금을 하지 못하게하는 예제 코드이다.

 

InsufficientException.java(사용자 정의 예외 클래스)

public class InsufficientException extends Exception {
	public InsufficientException() {
	}

	public InsufficientException(String message) {
		super(message);
	}
}

 

Account.java

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;
	}
}

 

Main.java

public class Main {
	public static void main(String[] args) {
		Account account = new Account();
		//예금하기
		account.deposit(10000); //만 원 입금
		System.out.println("예금액: " + account.getBalance());

		//출금하기
		try {
			account.withdraw(30000); //3만 원 출금
		} catch(InsufficientException e) { //사용자 정의 예외가 발생한다면
			String message = e.getMessage();
			System.out.println(message);
		}
	}
}
/*
예금액: 10000
잔고 부족: 20000 모자람
*/

댓글