티스토리 뷰

 

( 이전에 커스텀 예외에 대한 글을 정리한 적이 있어서, 해당 블로그의 내용을 좀 가져오겠다. )

https://kodong8774.tistory.com/126

 

자바 - 커스텀 예외 만들기

(오늘도 어김없이 백엔드 공부 중....) 이번 포스팅에서는 자바의 커스텀 예외에 대해서 글을 써보겠다.백엔드를 만들때, 자바 내부에 있는 예외를 그대로 사용한다면 정확히 어떤 부분에서 에러

kodong8774.tistory.com

 

🟩 커스텀 예외

프로그램을 만들면서 여러가지 상황에서 예외가 발생할 것인데, 이 모든 예외들을 자바의 표준 라이브러리 예외로 적절하게 표현하기는 적절하지 않다. 이에 우리는 커스텀 예외를 만들어 사용할 수 있다.

 

아래는 커스텀 예외의 기본 규칙이다.

1. 일반 예외로 선언 경우  → Exception 상속 
2. 실행 예외로 선언 경우 → RuntimeException 상속 
3. 커스텀 예외명은 Exception으로 끝나는 것을 권장함. 
4. 커스텀 예외 작성 시, 생성자는 두 개를 선언하는 것이 일반적임
    - 매개 변수가 없는 기본 생성자 
    - 예외 발생 원인(예외 메시지)을 전달하기 위해 String 타입의 매개변수를 갖는 생성자 

4번에 String 타입의 매개변수를 갖는 생성자를 선언해주는 이유는, 예외 객체의 공통 메소드인 getMessage()의 리턴값으로 사용하기 위해서이다. 

 

아래는 잔고 부족 예외를 커스텀 예외 클래스로 선언한 것이다.

public class InsufficientException extends Exception {
	public InsufficientException() {
    	}
    
    public InsufficientException(String message) {
    	super(message);
    }
}

 

 

🟩 예외 발생시키기 (throw 키워드) 

자바에서 제공하는 표준 예외 또는 커스텀 예외를 직접 코드에서 발생시키려면 throw키워드와 함께 예외 객체를 제공하면 된다. 

또 예외의 원인에 해당하는 메시지를 제공하고 싶다면 생성자 매개값으로 전달한다. 

아래는 throw키워드의 사용예시들이다.

throw new Exception();
throw new RuntimeException();
throw new InsufficientException();
// or
throw new Exception("예외 메시지");
throw new RuntimeException("예외 메시지");
throw new InsufficientException("예외 메시지");

 

(1) throw된 예외는 직접 try-catch 블록으로 예외를 처리할 수도 있지만, 

(2) 대부분은 메소드를 호출한 곳에서 예외를 처리하도록 throws키워드로 예외를 떠넘긴다고 한다.

아래는 각각 예시이다.

(1)

void method() {
	try {
    	// ...
        throw new Exception("예외 메시지");
        // ...
    } catch(Exception e) {
    	String message = e.getMessage();
    }
}

(2)

void method() throws Exception {
	// ...
	throw new Exception("예외 메시지");
    // ...
}

 

아래는 커스텀 예외의 활용 예제이다.

※ 예제 설명)

은행 계좌(Account) 클래스의 출금(withdraw) 메소드에서 잔고(balance) 필드와 출금액(매개값)을 비교해 잔고가 부족하면 InsufficientException을 발생시키고 throws한다. 그리고 Main은 withdraw() 메소드를 호출할 때 예외 처리를 한다. 

class Account {
    private long balance;

    public long getBalance() {
        return this.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;
    }
}

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

        // 출금하기
        try {
            account.withdraw(30000);
        } catch (InsufficientException e) {
            String message = e.getMessage();
            System.out.println(message);
        }
    }
}

 

 

 

 

여기까지. 

----------------------------------------------

현재 체스 게임을 다시 만들고 있는데, 진짜 제대로 설계에 대해서 고민해보면서 하다보니, 다시 또 처음부터 만들고 있다...

객체지향적 프로그래밍...... 너무 어렵다..

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함