프로그래밍 언어/JAVA

[JAVA] 예외처리 (1) try ~ catch, finally

느링 2017. 8. 25. 18:11

예외처리란

프로그래밍에서 예외가 발생했다는 말은 프로그램 에러라고 생각하시면 됩니다. 프로그램이 돌다가 이터를 잘못 받거나, 다른 데이터 타입의 자료를 사용한다거나 하는 에러를 "예외"라고 합니다. 

 

자바에서는 이러한 부분을 미연에 방지할 수 있는 방법이 있는데요,

바로 "try ~ catch" 구문 입니다.

 

※ try ~ catch 기본 구조

try {

//예외가 발생할 수 있는 상황

} catch (Exception형 e){

//예외 발생 상황을 e로 정의하여 처리(예외가 발생했을 때 처리하는 문장)

}

 

1. try ~ catch 문

 

<예제 1>

 

의미상의 오류가 있는 소스코드입니다.

result부분에서 에러가 생겼습니다. 이유는 바로 0으로 나눗셈을 하였기 때문입니다.

 

밑에 Consloe창에서 보면 메인스레드에서 "java.lang.ArithmeticException" 예외가 발생하였고

"/"(나눗셈)을 0으로 나눌 수 없다고 나와있습니다.

 

이러한 에러를 처리한 예제 코드를 다시 확인해보겠습니다.

 

<예제 1_2>

 

<예제 1_2>의 코드를 보시면 "try ~ catch" 구문을 사용하였습니다.

"try"구문에서 "try"라는 예약어와 중괄호{ }를 사용하여 그 안에 오류가 나는 소스를 담아둡니다.

 

"try" 바디부분에서는 에러를 감지하는 역을 합니다.

만약 "try"에서 에러를 감지했다면 에러와 관련된 "catch"로 넘겨서 예외 처리를 해주게 됩니다.

 

이러한 과정을 바로 "예외 처리를 한다."라고 말합니다.

 

** 다시 정리를 해보자면 **

① "try"구문에서 에러가 나면 "try"의 남은 소스를 더 이상 진행하지 않고 "catch"구문으로 가서 예외 처리를 해줍니다. 그 후 남은 코드를 수행합니다.

② 정상 동작시, "try"의 코드를 다 진행하고, 남은 코드를 실행하게 됩니다.

 

2. 2개 이상의 catch문

더 많은 예외 처리가 필요할 시에는 관련 예외를 처리하는 catch문을 더 명시해주시면 됩니다.

 

※ 2개 이산의 catch문 기본 구조

try {

//예외가 발생할 수 있는 상황

}catch (예외클래스 e){

//예외 발생 상황 1을 e로 정의하여 처리

}catch (예외클래스 e){

//예외 발생 상황 2를 e로 정의하여 처리

}

<예제 2>

 

<예제 2>의 코드를 보시면 catch문이 하나 더 늘어났습니다.

"ArrayIndexOutOfBoundsException" 관련 예외 처리 부분이 추가되었음을 보실 수 있습니다.

보시다시피 10개짜리 배열을 만들었는데 11번째 배열을 사용하려다 보니 발생하는 에러입니다.

 

"try"부분에서 이러한 배열에 관련된 에러가 발생했을 시, 컴파일러는 2개의 "catch"중에 "ArrayIndexOutOfBoundsException"예외 처리 "catch"문으로 분기하여 처리하게 됩니다.

 

 

** 자주 사용되는 Exception형 클래스 **

ArithmeticException 0으로 나눌 때 발생

NegativeArraySizeException → 배열의 크기가 음수일 때 발생

NullPointerException → 객체를 생성하기 전에 사용할 때 발생

ArrayIndexOutOfBoundsException → 배열의 인덱스가 범위를 벗어났을 때 발생

 

3. 반드시 실행해야 하는 finally문

finally문은 예외 발생 여부와 상관없이 항상 실행이 됩니다.

 

"try"는 예외가 발생 할 가능성이 있는 코드를 넣어서 에러를 감지하고,

"catch"는 발생한 에러를 예외 처리를 하고

"finally"는 에러가 발생하거나 안하거나 반드시 실행해야 하는 부분입니다.

 

※ finally문 기본 구조

try {

//예외가 발생할 수 있는 상황

} catch (예외클래스 e){

//예외 발생 상황을 e로 정의하여 처리

} finally {

//항상 실행 됨

}

<예제 3>