에러와 예외
- 프로그램 실행 중 어떤 원인에 의해 오동작하거나, 비정상적으로 종료되는 경우
- 컴파일 에러
- 자바 컴파일러가 오타, 문법, 자료형 체크 등에서 오휴가 있는 경우
- 런타임 에러
- 프로그램 실행 중 발생하는 에러
- 잘못된 결과 출력 및 비정상적인 프로그램 종료 발생
- 에러 : 메모리 부족 및 스택 오버플로(복구할 수 없는 심각한 오류)
- 예외 : 적절한 코드로 비정상적인 종료 방지 가능
예외처리 구문 구조
try {
// 예외 발생 가능성 코드
실행코드 1
실행코드 2
실행코드 3
} catch (예외 클래스1 e1) {
// 예외 클래스1의 예외가 발생하는 경우 실행될 코드
실행코드 4
} catch (예외 클래스2 e2) {
// 예외 클래스2의 예외가 발생하는 경우 실행될 코드
실행코드 5
} finally {
// 예외 발생 여부와 상관없이 무조건 실행되는 코드
실행코드 6
}
- 실행 코드가 한줄이라도, 중괄호 생략 불가
- 실행 코드 2에서 예외 클래스 1의 예외가 발생한 경우 실행 순서
- 예외가 발생하지 않은 경우 실행 순서
예외처리 예시
- 원래 3/0은 에러가 나는 것이므로 예외처리1이 실행된다.
- 3/0을 3/1로 바꾸고(참으로 바꿈) 배열 오류가 나므로 예외처리2가 실행된다.
public class ExceptionEx {
public static void main(String[] args) {
System.out.println("프로그램 시작");
try {
// System.out.println(3/0);
System.out.println(3/1);
int[] arr = new int[2];
System.out.println(arr[2]);
} catch (ArithmeticException e) {
System.out.println("예외발생");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("배열 에러");
} finally {
System.out.println("finally");
}
System.out.println("프로그램 끝");
}
}
- 예외처리를 일일이 다 해주는 것이 힘들 수 있으므로 catch문을 최상위 클래스인 Exception으로 바꾸어서 한 번만 사용하는 것도 가능하다.
public class ExceptionEx {
public static void main(String[] args) {
System.out.println("프로그램 시작");
try {
// System.out.println(3/0);
System.out.println(3/1);
int[] arr = new int[2];
System.out.println(arr[2]);
} catch (Exception e) {
System.out.println("예외발생");
} finally {
System.out.println("finally");
}
System.out.println("프로그램 끝");
}
}
예외처리 미루기
// 메서드 A
void 메서드A() throws 예외클래스명... {
...
}
// 메서드 B
void 메서드B () {
try {
메서드A(); // 메서드 A 호출
} catch (예외 클래스명 e) {
예외 처리;
}
}
- 메서드 A가 실행되는 메서드 B에서 예외처리를 실행하게 된다.
- 메서드 B가 예외처리를 하지 않으면 오류 발생
강제로 예외 발생시키는 방법
throw new 예외 클래스명("문자열");