[java] Exception, 익셉션의 이해 (Runtime Exception vs Exception)
Q. 자바에서 예외를 처리하는 객체는 Exception 입니다.
일반적인 Exception과 Runtime Exception, 이 두가지 공부해봅니다.
1. Exception ??
2. try/catch ??
3. throw/throws ??
4. 일반적이지 않은 Exception 인 Runtime Exception ??
1. Exception ??
Exception(예외)는 컴파일 또는 실행중에 생길수 있는 예외처리를 말합니다.
물론 프로그래머가 예외처리가 날것이라고,
예측할수 있는 상황에서 처리 할수 있는 처리가 바로 Exception(예외처리) 입니다.
위에 말이 어려우신가요.. ? ^^;;
예를 들어, 위험한 메소드를 호출할때 입니다.
getMoney(); |
getMoney() 라는 메소드를 호출해야 하는데,
이 메소드를 실행했을때 예외처리가 발생할수도 있다는 것을 알고 있다면 !
이 부분에 Exception 이 발생할수도 있으니,
예외처리가 났을때는 이렇게 처리하라고 지시 할수 있습니다.
지시하는 것이 바로 try/catch 입니다.
2. try/catch ??
아래 메소드를 호출했을때, 예외처리가 발생할 수 있는 상황이라면,
try/catch를 사용하여 예외처리 발생 후의 일을 지시할수 있습니다.
try { getMoney(); } catch( Exception e ) { // 예외처리 발생했을시 catch 메소드가 실행됨 System.out.println( "Exception 발생" ); } |
예외처리가 날수도 있는 부분을 try 로 감싸고, 아래 부분에 catch 블록을 만들어 줍니다.
try 부분에서 예외처리가 발생하면 catch 블록이 실행되게 됩니다.
참 쉽죠 ~ ?
+ 보너스1
catch 블록은 여러개 존재 할수 있습니다.
발생할수 있는 Exception 을 따라서 만들수 있는데요.
try { getMoney(); } catch( SQLException sqle ) { // SQLException 이 발생했을때 } catch( NullPointerException e ) { // NullPointerException이 발생했을때 } |
위에 보시는 것처럼 SQLException 과 NullPointerException 이 났을때를
구분하여 예외처리 처리를 할수 있습니다.
+ 보너스2
try/catch 와 별개로 무조건 실행되어야 하는 코드는
finally 블록에 입력하면 됩니다.
try { getMoney(); } catch( SQLException sqle ) { // SQLException 이 발생했을때 } finally { // 무조건 실행 } |
※ 참고 : catch 를 할때, catch( Exception e )로 모든 Exception을 잡을 수는 있지만,
이 Exception 으로는 어떠한 문제가 발생되었는지를 알수가 없습니다.
그러므로, 되도록이면 정확한 Exception 사용하여 별도의 catch 블록을 사용하는것이 바람직 합니다.
3. throw/throws ??
Exception 을 사용하다보면 throw 와 throws 를 사용하게 되는데요.
throw : 강제 처리
throws : 책임 전가
라고 이해하시면 됩니다.
우선 throws 부터 알아보겠습니다.
throws는 현재 메소드에서 발생된 SQLException을
getMoney() 를 호출한 메소드에 SQLException 을 전달하는 것입니다.
void getMoney() throws SQLException { } |
getMoney 메소드를 실행하다 발생한 예외상황에 대해서,
자기 자신이 아닌 다른 메소드에 책임을 전가 하는 것이 throws 입니다.
그럼 throw 에 대해서 알아보겠습니다.
try { getMoney(); } catch( SQLException sqle ) { throw new SQLException(); } |
위 Exception 처럼 예외 처리가 발생했을때, 강제로 Exception 을 발생하는 것이 throw 입니다.
try/catch 블록을 사용하지 않고, 강제로 Exception 을 발생시킬 때 주로 사용합니다.
4. 일반적이지 않은 Exception 인 Runtime Exception ??
지금까지 제가 설명드린 Exception은 컴파일 Exception, 일반적인 예외처리를 말합니다.
그럼 Exception 에서 그럼 Runtime Exception 은 무엇일까요.. ?
일반적인 Exception은 컴파일,
그러니까 실행하기 전(코드 -> 바이트 코드 변환 시)에 모든 예외처리를 잡아냅니다.
그렇다면, Runtime Exception 바로 실행중에 발생되는 예외처리를 말합니다.
예를 들면,
int digit = Integer.parseInt( value ); |
라는 구문 이 있습니다.
value 라는 변수를 int 형으로 변환하여 digit 라는 변수에 넣는 것인데,
value 라는 변수가 항상 숫자만 올것이라는 확신을 할수 없습니다.
이때 발생하는것이 Runtime Exception 입니다.
기존 Exception 과는 다르게 Runtime Exception은 무시하고,
코딩하여도 컴파일시에 Exception을 잡아내지 않습니다.
실행시 발생하는 Runtime Exception은
자동으로 JVM 예외를 발생하여 처리해줌으로써 확인할 수 있습니다.
※ 실행 중에만 발생하는 Runtime Exception 은 미리 체크 하지 않지만,
try/catch 로 잡아주는것이 좋습니다.
String value = "a"; int digit = Integer.parseInt( value ); System.out.println( digit ); |
위 문장 보다는, 아래 처럼 처리 해주는 것이 좋습니다.
String value = "a"; try { int digit = Integer.parseInt( value ); System.out.println( digit ); } catch( NumberFormatException e ) { System.out.println( "NumberFormatException" ); } |
※ 참고
1. Head First Java: 뇌 회로를 자극하는 자바 학습법(개정판) -> 353 page ~ 372 page
2. http://blog.naver.com/clown7942?Redirect=Log&logNo=110128292039