반응형

전시간에 공부한 내용을 잠시 떠올려보자.

프로그램 오류는 크게 3가지 종류로 구분했다.

  • 컴파일에러
  • 런타임 에러 (실행 중에 발생한 에러)
    • Error : 심각한 에러
    • Exception : 미약한 에러
      • Exception과 그 자손들
      • RuntimeException과 그 자손들
  • 논리적 에러

이렇게 정의해서 구분해 놓았었다.

그런데, 우리가 심각한 에러인 Error는 어떻게 할 수가 없지만,

미약한 에러인 Exception을 처리하기 위해서, Exception에 대비한 코드를 작성하는 것이 "예외 처리"이다.

 

예외 처리하기, try-catch문

 

예외가 발생 할 때, 처리하는 것이 try-catch문 이고, 작성 방법은 위의 예시와 같다.

예외가 발생할  가능성이 있는 블럭을 try블럭에 넣고, 

예외가 발생했을 때, 수행할 문장들을 catch블럭에 넣는다. 
catch블럭은 여러개가 올 수 있다. 왜냐하면, 발생할 수 있는 예외가 여러개 일 수 있기 때문이다. 

예를 들어, 쇼핑할 때, 발생할 수 있는 예외들을 처리해보자.
우선, 쇼핑할 때, 발생할 수 있는 예외들을 생각해보면,

"돈이 부족하다"
 "사려는 물건이 없다."
"가게가 문닫았다."

등의 예외사항이 있을 수 있다.

그러면, 이 예외사항에 대해서 처리할 코드를 각 catch블럭에 넣는 것이다. 

위의 예시코드를 기준으로 만약에 쇼핑하다가, 돈이 부족하면,
첫번째 catch블럭에 와서 문장을 실행하고, try문을 빠져나가게 된다.

그리고 한가지 조심할 점은,
if문은 블럭 내에 포함된 문장이 하나뿐이면 괄호{}를 생략할 수 있지만, 
try-catch문은 블럭내에 포함된 문장이 하나뿐이어도 괄호{}를 생략할 수 없다. 

 


 

try-catch문에서의 흐름

 

try-catch문에서 예외가 발생했을 때와, 발생하지 않았을때 각각 어떤 흐름으로 문장들이 수행되는지 알아보자.

 

예제 8_1이다. (예외가 발생하지 않은 경우)

메인메서드부터 시작해서 1번출력하고, 
그리고, 2,3 출력하고, 
예외가 발생되지 않았으므로 catch블럭은 실행되지 않는다.
그리고 try-catch문 전체를 빠져나와서 
그 다음 문장인 5를 출력한다.

catch블럭에 있는 4는 출력되지 않았다.
왜냐하면, catch블럭은예외가 발생했을 때 실행되는 것이기 떄문에
위의 코드에서는 예외 발생이 되지 않았기 때문에 정상적으로 문장을 수행하고, try-catch블럭을 빠져 나왔다.

 

이번에는 예제 8_2 다. (예외가 발생한 경우)

1출력한 다음에, 
try블럭으로 들어가는데, 
System.out.println(0/0); 에서 예외가 발생했다.
0으로 나누는 것은 금지되어 있다.  그런데 0으로 나누었다. (일부로 예외 발생 시킨 것) 
그러면, try블럭의 문장들의 수행을 멈추고,
catch블럭으로 간다.  그리고 해당 예외를 처리할 수 있는 catch블럭을 찾아서 그 블럭에 있는 문장들을 실행한다.
0으로 나누었을 때는, ArithmeticException이 발생을 해서
해당 catch블럭이 매칭되어 해당 catch블럭의 문장이 수행되고,
try-catch문 전체를 빠져나간다. 
그리고 남은 문장들을 수행한다.   

예외가 발생한 경우,
발생한 예외와 일치하는 catch블럭이 있는지 확인한 후, 일치하는 catch블럭의 문장들을 수행하고,
try-catch문 전체를 빠져나가게 되는데,
만약, 발생한 예외와 일치하는 catch블럭이 없으면, 예외는 처리되지 못한다. 예외처리가 되지 않으면, 프로그램 비정상적으로 종료된다.

 


예외의 발생과 catch블럭

  • 예외가 발생하면, 이를 처리할 catch블럭을 찾아 내려감

 

try블럭에서 예외가 발생하면, 이를 처리할 catch블럭을 찾아 내려간다.

예제를 보면, 1, 2를 출력하고 3까지 출력했다. 

System.out.println(0/0);에서 0으로 나누기 때문에,
ArithmeticException이 발생한다.

그래서 System.outprintln(0/0)에서 tyry블럭을 빠져나와서 
예외를 처리하려고 catch블럭을 찾는다. 

그런데, catch블럭이 2개가 있다. 
첫번쨰부터 차례대로 catch블럭부터 일치하는지 확인과정을 거친다.
그런데 이번 예제에서는 첫번째 catch블럭에서
ArithmeticException으로 일치하므로  해당 catch블럭에 있는 문장들이 실행된다.

그리고나면, try-catch문 전체를 빠져나와서  6을 출력하고 끝난다. 

 

만약에 try문에서 발생한 예외가 ArithmeticException가 아니면 어떻게 될까?

첫번째 catch블럭은 try문에서 발생한 예외와 종류가 다르기 때문에
두번쨰 catch블럭으로 간다.

두번째 catch블럭에 선언된 예외는 "Exception"인데,
Exception은 모든 예외의 최고조상이다. 
그렇기 때문에, 모든 예외가 다 처리된다. 

그래서 Exception이 선언된 캐치 블럭은 제일 마지막에 와야한다.

 

 

반응형