예외 처리

개발자가 되고 싶어요 ㅣ 2024. 2. 22. 11:16

예외 처리

일반 예외(Exception)

  • 컴파일러가 예외 처리 코드 여부를 검사하는 예외를 말한다.

실행 예외(Runtime Exception)

  • 컴파일러가 예외 처리 코드 여부를 검사하지 않는 예외를 말한다.

 

예외 처리 코드

  • try-catch-finally문 (finally는 선택)
try {
	// 로직
} catch(Exception e) /* Exception: 예외클래스 */ {
	// try문의 로직에서 파라미터에 해당하는 예외가 발생했을 때 로직
	
	// 예외 정보를 얻는 3가지 방법
	System.out.println(e.getMessage());
	System.out.println(e.**toString()**);
	System.out.println(**e.printStackTrace()**);
} finally {
	// 예외가 발생하든 안하든 실행되는 로직
}
  • 예외 정보를 얻는 3가지 방법
    1. e.getMessage(): 예외가 발생한 이유만 리턴
    2. e.toString(): 예외가 발생한 이유 + 예외의 종류 리턴
    3. e.printStackTrace(): 예외가 발생한 이유 + 예외의 종류 + 예외가 발생한 라인 추적 리턴

 

예외 종류에 따른 처리

다중 catch문을 통해 여러 예외를 처리할 수 있다.

다음 예제는 try문에서 두 가지 예외가 발생한다.

  1. “1oo”라는 값을 int로 변환 할 수 없는 예외
  2. i≤array.length라는 조건 때문에 배열의 최대 인덱스인 1를 넘어가는 예외

이때 각 예외가 발생하면 예외 클래스에 해당하는 catch문으로 이동하게 된다.

단, 하나의 예외는 하나의 예외 클래스만 발생하기 때문에 하나의 catch문만 실행된다.

또한 처리해야 할 예외 클래스들이 상속 관계에 있을 때는 작성된 catch 블록 순서로 실행되기 때문에 하위 클래스 catch블록을 먼저 작성하고 상위 클래스 catch 블록을 나중에 작성해줘야 한다.

두 개 이상의 예외를 하나의 catch 블록으로 동일하게 예외 처리하고 싶을 때는 기호 | 를 넣어서 처리한다.

 

예외 떠넘기기

  • 메소드 내부에서 예외가 발생할 때 try-catch 블록으로 예외를 처리하는 것이 기본이지만, 메소드를 호출한 곳으로 예외를 떠넘길 수도 있다. 이때 사용하는 키워드가 throws이다. throws는 메소드 선언부 끝에 작성하는데, 떠넘길 예외 클래스를 쉼표로 구분해서 나열해주면 된다.

사용자 정의 예외

예를 들어 은행의 뱅킹 프로그램에서 잔고보다 더 많은 출금 요청이 들어온 경우에는 잔고 부족 예외를 발생시킬 필요가 있다. 그러나 잔고 부족 예외는 표준 라이브러리에는 존재하지 않기 때문에 직접 예외 클래스를 정의해서 사용해야 한다. 이것을 사용자 정의 예외라고 한다.

사용자 정의 예외는 컴파일러가 체크하는 일반 예외로 선언할 수도 있고, 컴파일러가 체크하지 않는 실행 예외로 선언할 수도 있다. 통상적으로 일반 예외Exception의 자식 클래스로 선언하고, 실행 예외RuntimeException의 자식 클래스로 선언한다.

  1. Exception을 extends해서 사용자 정의 예외를 만들어준다.
public class InsufficientException extends Exception {
	public InsufficientException() {
	}
	public InsufficientException(String message) {
		super(message);
	}
}

 

2. 예제를 위해 입금, 출금 메서드와 잔고를 저장한 변수가 들어있는 객체를 만들어준다. 이때, 출금메서드에서 잔고보다 많은 돈을 출금하려 한다면 throw를 통해 직접 코드에서 InsufficientException예외를 발생시킨다.

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 InsufficientExcetpion("잔고 부족: " + (money-balance)+" 모자람");
		}
		balance -= money;
	}
}

 

3. 예금하기는 예외가 발생하지 않는다, 하지만 출금하기에서 10000원 밖에 없는데 30000원을 출금했기 때문에 출금 메서드에서 throw를 통해 발생시킨 InsufficientException예외가 발생한다. 따라서 InsufficientException예외를 잡는 catch문이 실행되게 된다. 이때 인자 e에는 우리가 만든 InsufficientException예외의 객체가 담기고 정의한대로 예외가 처리되게 된다.

public class ExceptionPractice {
	public static void main(Stirng[] 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);
		}
	}
}

 

4. 출력

'Java' 카테고리의 다른 글

멀티 스레드  (0) 2024.04.17
싱글톤 패턴  (0) 2024.03.02
Getter와 Setter  (0) 2024.02.27
접근 제한자  (0) 2024.02.26
자바  (1) 2024.01.27