티스토리 뷰
Exception
예외처리하는 문법
- 오류가 발생할 예상 부분을 try라는 블록으로 감싼 후, 발생할 오류와 관련된 Exception을 catch라는 블록에서 처리한다.
- 오류가 발생했든 안했든 무조건 실행되는 finally라는 블록을 가질 수 있다.
- finally블록은 생략가능하다.
try{ int k = i / j; System.out.println(k); }catch(ArithmeticException e){ System.out.println("0으로 나눌 수 없습니다. : " + e.toString()); }finally { System.out.println("오류가 발생하든 안하든 무조건 실행되는 블록입니다."); }
try블록에서 여러종류의 Exception이 발생한다면 catch라는 블록을 여러개 둘 수 있다.
Exception클래스들은 모두 Exception클래스를 상속받으므로, 예외클래스에 Exception을 두게 되면 어떤 오류가 발생하든지 간에 하나의 catch블록에서 모든 오류를 처리할 수 있다.
Throws
throws는 예외가 발생했을때 예외를 호출한 쪽에서 처리하도록 던져준다
public static int divide(int i, int j) throws ArithmeticException{
int k = i / j;
return k;
}
메소드 선언 뒤에 throws ArithmeticException 이 적혀있는 것을 알 수 있습니다. 이렇게 적어놓으면 divide메소드는 ArithmeticException이 발생하니 divide메소드를 호출하는 쪽에서 오류를 처리하라는 뜻입니다.
Throw
Exception 발생시키기
강제로 오류를 발생시키는 throw
throw는 오류를 떠넘기는 throws와 보통 같이 사용됩니다.
public static int divide(int i, int j) throws IllegalArgumentException{
if(j == 0){
throw new IllegalArgumentException("0으로 나눌 수 없어요.");
}
int k = i / j;
return k;
}
사용자정의 Exception\
- Exception 클래스를 상속 받아 정의한 checked Exception
- 반드시 오류를 처리 해야만 하는 Exception
- 예외 처리하지 않으면 컴파일 오류를 발생 시킨다.
- RuntimeException 클래스를 상속 받아 정의한 unChecked Exception
- 예외 처리하지 않아도 컴파일 시에는 오류를 발생시키지 않는다.
RuntimeException을 상속받은 BizException객체
public class BizException extends RuntimeException { public BizException(String msg){ super(msg); } public BizException(Exception ex){ super(ex); } }
- 예외 처리하지 않아도 컴파일 시에는 오류를 발생시키지 않는다.
앞에서 만든 BizService를 이용하는 BizExam클래스
- 매개변수 값을 -1을 넘길때는 Exception이 발생하기 때문에 try catch블록으로 처리한다.
public class BizExam {
public static void main(String[] args) {
BizService biz = new BizService();
biz.bizMethod(5);
try{
biz.bizMethod(-3);
}catch(Exception ex){
ex.printStackTrace();
}
}
}