지금까지 API의 소비자로서 API 측에서 던지는 예외를 처리하는 방법을 알아봤다. 이번에는 API의 생산자로서 소비자들에게 API를 제공하는 입장에 서보자.
우리가 할 수 있는 조치는 두가지다.
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());
}
}
}
필자가 사용한 예외인 IllegalArgumentException, ArithmeticException은 자바에서 기본적으로 제공하는 예외다. 이러한 예외들은 자바 가상머신이 사용하기도 하고 또 응용 프로그램 개발자가 사용할 수도 있다. 기본적으로 제공되는 어떤 예외들이 있는지를 파악하고 적당한 예외를 사용하는 것은 중요한 문제다. 클래스 Exception을 API 문서에서 찾아보고 그 하위 클래스로 어떤 것들이 있는지 살펴보는 것도 도움이 된다. 다음은 기억할만한 주요 Exception들의 리스트다.
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 )