멍발자의 개발
예외 처리 본문
예외 (Exception)
프로그램 실행할 때 예기치 못한 오류가 발생할 때를 말한다.
- 배열의 요소수보다 큰 요소수를 지정해 액세스를 실시한 경우
- 사용자가 입력 실수를 하였을 때
- 존재하지 않는 파일을 읽고 지정하였을 때
- 데이터베이스에 연결할 수 없을 때
- 할당되지 않은 저장 영역에 액세스한 경우
- 정수를 0으로 나누었을 때
예외를 처리하는 방법 (try - catch)
try { 실행내용 ...
} catch (예외처리문) {
예외 처리 내용
}
오류가 발생할 것 같으면 항상 try catch문을 사용하자.
<배열의 요소수보다 큰 요소수를 지정해 액세스를 실시한 경우>
public class ArrayException2 {
public static void main(String[] args) {
try {
//int 배열
int[] intArray = new int[5];
// 10 인덱스에 값을 대입
System.out.println("intArray[10]에 숫자를 할당합니다.");
intArray[10] = 50; // 최대 배열 요소수를 초과하는 대입처리
// 결과표시
System.out.println("intArray[10]에 50을 할당하였습니다.");
} catch (ArrayIndexOutOfBoundsException e) {// 최대 배열 소소수 초과 예외처리
System.out.println("배열의 요소수를 초과했습니다.");
}
System.out.println("프로그램 종료");
}
}
//결과
intArray[10]에 숫자를 할당합니다.
배열의 요소수를 초과했습니다.
프로그램 종료
<정수를 0으로 나누었을 때>
public class ZeroException2 {
public static void main(String[] args) {
try {
// 숫자를 0으로 나눔
int num = 10 / 0;
// 결과
System.out.println("10/0 결과: " + num);
} catch (ArithmeticException e) { // 0 나누기의 예외처리
System.out.println("0으로 나눌 수 없습니다.");
}
System.out.println("처리 종료");
}
}
// 결과
0으로 나눌 수 없습니다.
처리 종료
<예외처리를 하지 않는 프로그램의 흐름>
main 메소드에서 오류에 대한 예외처리가 발견 안 됨 > 호출원으로 돌아가 대응하는 예외처리를 찾음 > 호출원 없음 > 중간종료
예외를 처리하는 방법 (try - catch) finally
finally 블록은 catch 문 다음에 설명한다.
finally 블록은 중요하게 체크할 수 있는 부분을 체크하고 넘어갈 수 있다.
예외 유무에 관계 없이 반드시 처리를 해 준다.
public class FinallyBlock {
public static void main(String[] args) {
try {
// int형 배열
int[] intArray = new int[5];
// 배열에 값을 할당
System.out.println("배열에 숫자를 할당합니다.");
intArray[10] = 50; // 예외를 일부러 발생시키는 대입
// intArray[0] = 50; // 올바르게 할당
// 결과 표시
System.out.println("배열에 50을 할당했습니다.");
} catch (ArrayIndexOutOfBoundsException e) { //최대 배열 요소수를 초과하는 예외 처리
System.out.println("배열의 요소수를 초과했습니다.");
} finally {
System.out.println("예외처리의 마지막 처리입니다."); //finally 블록
}
System.out.println("처리 종료");
}
}
//결과
배열에 숫자를 할당합니다.
배열의 요소수를 초과했습니다.
예외처리의 마지막 처리입니다.
처리 종료
예외 처리를 실시한 경우와 실시 안 한 경우의 비교
프로그램의 이상 종료를 방지할 수 있다.
한 곳의 예외에 대한 처리를 정리하는 것이 가능해진다.
예외 처리의 기본 (try catch finally)
예외를 throw 한다. = 프로그램 실행 중에 에러가 발생했다.
예외를 catch 하다. = 예외를 잡다.
예외가 발생할 것으로 발생되는 처리 블록을 try {}으로 묶는다.
catch문은 복수 기술할 수가 있으므로 인수에 예외를 지정할 수 있다.
finally 블록은 반드시 실행된다. 생략도 가능하며 파일의 close 처리나 DB로부터의 절단 처리등을 기술한다.
try, catch 블록에 return statement가 기술되고 있어도 finally 블록은 실행된다.
비체크 예외: 예외 처리를 기술하지 않아도 컴파이라 할 수 있는 예외의 것 = 별로 추천하진 않는다.
<비체크 예외 종류>
- ArithmeticException
- NullPointerException
- ArrayIndexOutOfBoundsException
- IndexOutOfBoundsException
- ArrayStoreException
- ClassCastException
- NoSuchFieldException
- NoSuchMethodException
- RuntimeException
- IllegalAccessException
- NumberFormatException
체크 예외: 예외 처리를 기술하지 않으면 컴파일 에러가 되는 예외 = 반드시 실행해야 한다.
<체크 예외 종류>
- IOExceptiuon
- ClassNotFoundException
- FileNotFoundException
예외 클래스의 상하관계
상위 클래스에 예외 처리를 지정하면 거기에 포함되는 서브 클래스의 예외를 모두 catch 해 준다.
오류(Error)
오류는 "하드웨어 고장", "메모리 부족" 등이 있다.