참고 : http://benelog.egloos.com/1901121
http://crosscutter.info/56
http://crosscutter.info/63
1. Exception 사용 예제
1) 예외를 던지는 위험한 코드
코드에서 예외를 던진다면, 반드시 메소드를 선언하는 부분에서
throws 키워드를 써서 선언해줘야한다.
public void takeRisk() throws BadException { if(abandonAllHope) { throw new BadException(); } }
exception를 선언하는 과정을 통해, BadException을
던질 수 있다는 것을 외부에 알린다.
2) 위험한 메소드를 호출하는 코드
예외를 던지는 메소드를 호출하면, 예외발생 가능성이 있음을 알고
있다는 것을 표현해야 한다. 즉 try/catch 사용
public void crossFingers(){ try{ anObject.takeRisk(); } catch (BadException ex) { System.out.println("A~~~ gh~!"); ex.PrintStackTrace(); } }
2. Exception은 반드시 처리(try/catch)하거나,선언(회피, throws 사용) 해야 한다.
1) 처리 하기
try{ laundry.doLaundry(); } catch (ClothingException cex){ //exception처리 }
2) 선언(회피하기)
void foo() throws ClothingException { laundry.doLaundry() }
% 메소드에서 예외를 던지면, 그 메소드는 스택에서 곧바로 제거된다.
exception은 스택 바로 밑에 있는 메소드(즉, 이를 호출한 메소드)로
던져진다.
3. 참고사항
* 컴파일러에서는 RuntimeException을 제외한 모든 것을 확인함
* Checked Exception
RuntimeException 의 하위클래스에 속하지 않는 Exception 객체는
컴파일러에서 확인해야 하는데, 이런 에외를 "Checked Exception" 이라 함.
예를들어, IOException/ InterruptedException등
Exception - IOException
- InterruptedException
- RuntimeException - ClassCastException
- NullPointerException
* Unchecked Exception
RuntimeException 객체는 컴파일러에서 확인하지 않는데,
이런 예외를 "Unchecked Exception"이라 한다.
* RuntimeExcpetion 유형에 속하는 Exception에 대해서는,
컴파일러에서 신경을 쓰지 않는다. RuntimeException은 선언하지
않아도 되고, try/catch로 포장할 필요도 없다.
* 메소드에서 두개의 Exception을 던질 수도 있다.
public void doLaundray() throws PantsException, LingerieException { .. }
* 여러 exception이 있는 경우, JVM에서는 순서대로 확인하기 때문에,
맨 위부터 하위 Exception부터 사용해야함
4. 주의점
* try/ catch 불록에 return이 있어도, finally 블록은 실행됨
* exception 발생시, catch 실행후 이후 모두 실행함(return아님)