반응형

예외 발생시키기

 

연산을 하거나, 메서드를 호출 했을 때, 예외가 발생할 수 있는데,
그것뿐만 아니라, 우리가 직접 예외를 발생시킬 수 도 있다.  

먼저 객체를 만든다음, new연산자를 이용해서 예외 객체를 만들고, 
throw라는 키워드를 이용해서 예외를 발생시킨다

Exception e = newException("고의로 발생시켰음");. 에서 생성한 객체를
thorw e;로 던지는 것이다. 

그래야 예외가 발생한다.

객체를 만드는 것 만으로는 예외가 발생하지 않는다. 
꼭 throw를 써줘야 예외가 발생된다.

 

예제를 보면, 
우선, 예외 객체를 만들었다.  생성자에 들어가는 "고의로 발생시켰음."이 예외 메시지이다. 
예외 객체에는 예외에 대한 정보가 담겨있다.

그다음, 그 객체를 담고있는 참조변수 e를 throw한다.

그러면, e와 같은 타입을 가지고 잇는 catch블럭이 잡는다.
첫번째 catch블럭이 e와 일치하므로 해당 catch블럭에서 처리된다.

catch블럭에서 e.getMessage()로 메시지를 얻고,
printStackTrace()를 이용해서 정보를 얻는다. 

catch블럭에서 예외가 처리되었기 때문에, 
try-catch블럭을 벗어나서 그다음문장까지 정상적으로 실행된다. 

만약에, catch블럭이 없었다면, 프로그램은 비정상 종료 되었을 것이다. 

 


 

checked예외, unchecked예외

예외의 종류에는  checked예와와 unchecked예외가 있다.

  • checked예외 : 컴파일러가 예외 처리 여부를 체크 (예외 처리 필수)
  • unchecked예외 : 컴파일러가 예외 처리 여부를 체크 안함(예외 처리 선택)

checked예외는 예외처리가 필수적인 것이고,
unchecked예외는 예외처리가 선택적인 것이다. 

checked예외는 Exception과 그 자손을 의미하고,
unchecked예외는 RuntimeException과 그 자손을 의미한다.

 

예제를 보자.

예외를 생성해서 던지는데,
이런 코드를 작성하면, 컴파일 결과가 에러다. 즉, 컴파일 조차 안된다. 

왜냐하면, Exception은 checked 예외라서
예외를 필수로 처리해야 하기 때문이다. 
try-catch문을 이용해서 처리해야하는데 처리해주지 않아서 컴파일 에러가 난다.

 

이번 예제는 RuntimeException()을 발생시켜서 던지는데,

RuntimeException은 unchecked예외다. 
즉, 예외처리가 선택이다.
따라서 try-catch문으로 처리해주지 않아도 컴파일은 Ok다.

하지만, 실행을 하면, RuntimeException이 발생해서 프로그램이 비정상 종료된다.

 


 

오류 종류 정리

Exception과 자손들은 checked예외로, try-catch문으로 처리가 필수다.

RuntimeException은 unchecked예외로 try-catch문 처리가 선택이다. 

그이유를 알아보자.

RuntimeException의 자식들을 보면, 
0으로 나눌때, 
형변환,
참조변수가 null일 때, 
배열범위를 벗어날 때 등이 있는데,

 

 

만약, RuntimeException을 checked예외로 지정하면,
어떤 일이 발생할까?

예제코드를 보자.

이러한 코드가 있을 때, 
arr이 참조변수인데, 모든 참조변수를 사용할 때, NullPointerException이 발생할 가능성이 있다. 
arr은 indexOutOfBoundsException 발생할 수도 있다.
그러면, 이러한 코드들도 전부 try-catch문으로 처리해야되는데,
여러가지를 고려하다보면, 결국 거의 전부를 try-catch문으로 처리해야 하는 상황이된다.

따라서 RuntimeException이 발생할 수 있는 문장들은, try-catch으로 예외처리 하는 것을 선택적으로 할 수 있도록 만들었다.(Unchecked예외)

그래서 RuntimeException는 프로그래머가 조심해서 코딩해야 할 부분이다. 

 

반응형