Java 예외 3 - 만들기

별의개발자커비·2023년 2월 16일
0

Java

목록 보기
48/66
post-thumbnail

소비자에서 생산자로

지금까지 API의 소비자로서 API 측에서 던지는 예외를 처리하는 방법을 알아봤다. 이번에는 API의 생산자로서 소비자들에게 API를 제공하는 입장에 서보자.
우리가 할 수 있는 조치는 두가지다.

  • setOprands의 두번째 인자로 0이 들어오면 예외를 발생시킨다.
    메소드 divide를 실행할 때 right의 값이 0이라면 예외를 발생시킨다.
class Calculator{
    int left, right;
    public void setOprands(int left, int right){
        this.left = left;
        this.right = right;
    }
    public void divide(){
			  if(right == 0){ // 이 멘트가 오류창에 빨간 글씨로 뜨게 됨
        throw new ArithmeticException("0으로 나눌 수 없습니다.");
      }
        try {
            System.out.print("계산결과는 ");
            System.out.print(this.left/this.right);
            System.out.print(" 입니다.");
        } catch(Exception e){
            System.out.println("\n\ne.getMessage()\n"+e.getMessage());
            System.out.println("\n\ne.toString()\n"+e.toString());
            System.out.println("\n\ne.printStackTrace()");
            e.printStackTrace();
        }
    }
}

class Main {

    public static void main(String[] args) {
        Calculator c1 = new Calculator();
        c1.setOprands(10, 0);
			try{
				c1.divide();
			} catch(ArithmeticException e){
       System.out.println(e.getMessage());
			}
    }
}
  • throw는 예외를 발생시키는 명령이다. throw 뒤에는 예외 정보를 가지고 있는 예외 클래스가 위치한다. 자바 가상 머신은 이 클래스를 기준으로 어떤 catch 구문을 실행할 것인지를 결정한다. 또 실행되는 catch 구문에서는 예외 클래스를 통해서 예외 상황의 원인에 대한 다양한 정보를 얻을 수 있다. 이 정보를 바탕으로 문제를 해결하게 된다.

필자가 사용한 예외인 IllegalArgumentException, ArithmeticException은 자바에서 기본적으로 제공하는 예외다. 이러한 예외들은 자바 가상머신이 사용하기도 하고 또 응용 프로그램 개발자가 사용할 수도 있다. 기본적으로 제공되는 어떤 예외들이 있는지를 파악하고 적당한 예외를 사용하는 것은 중요한 문제다. 클래스 Exception을 API 문서에서 찾아보고 그 하위 클래스로 어떤 것들이 있는지 살펴보는 것도 도움이 된다. 다음은 기억할만한 주요 Exception들의 리스트다.

예외의 여러가지 상황들

예외의 선조 - Throwable (이해 잘 안감)

  • 만들려는 예외가
  • checked?: 부모 클래스에 runtime 없어도 됨
  • unchecked?: 부모 클래스에 runtime이 있어야 함
try {
    System.out.println(arr[first] / arr[second]);
} catch(ArrayIndexOutOfBoundsException e){
    System.out.println("ArrayIndexOutOfBoundsException");
} catch(ArithmeticException e){
    System.out.println("ArithmeticException");
} catch(Exception e){
    System.out.println("Exception");
}

  • untimeException을 제외한 Exception 클래스의 하위 클래스들과 RuntimeException 클래스의 차이를 자바에서는 checked와 unckecked라고 부른다. 관계를 정리하면 아래와 같다.

  • checked 예외 - RuntimeException을 제외한 Exception의 하위 클래스

    • 반드시 예외처리를 해야 하는 되는 것
  • unchekced 예외 - RuntimeException의 하위 클래스

    • 해도 되고 안 해도 되는 예외다.

학원

// 1. e.printStackTrace(): 죽지않고 에러메시지 출력하고 뒤에는 계속 실행됨
// 2. getmessage
// 3. 


// @1. exception은 runtimeException과 그냥이 있는데
// runtime은 실행 한 후에 알 수 있으니 
// 그냥이 더 안전하겠지?

( 출처 생활코딩 https://opentutorials.org/module/516/6228 )

0개의 댓글