예외처리란
프로그래밍에서 예외가 발생했다는 말은 프로그램 에러라고 생각하시면 됩니다. 프로그램이 돌다가 데이터를 잘못 받거나, 다른 데이터 타입의 자료를 사용한다거나 하는 에러를 "예외"라고 합니다.
자바에서는 이러한 부분을 미연에 방지할 수 있는 방법이 있는데요,
바로 "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>
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[JAVA] 예외처리 (2) throws (0) | 2017.09.05 |
---|---|
[JAVA] 추상 클래스(abstract) (0) | 2017.08.28 |
[JAVA] 인터페이스(interface) (0) | 2017.08.25 |
[JAVA] getter/setter 메소드 (0) | 2017.08.25 |
[JAVA] instanceof 연산자 (1) | 2017.08.24 |