1. 에러(Error, =오류)
: 프로그램을 수행할 때 치명적인 상황이 발생하여 비정상적인 종료 상황이 발생한 것을 프로그램 에러라고 한다.
(1) 종류
① 논리 에러
: 소스코드 상의 문법적 오류가 없고, 프로그램을 실행했을 때에도 문제가 없지만 프로그램의 의도상 맞지 않을 때 발생하는 에러(기획과 설계가 잘못됨)
② 시스템 에러
: 컴퓨터의 오작동으로 인해 발생하는 에러이며, 소스코드로 해결되지 않는다.(심각한 에러)
③ 컴파일 에러
: 프로그램을 실행하기 전에 소스코드 상의 문법적인 문제로 발생하는 에러이며, 소스코드를 수정하여 해결한다.
④ 런타임 에러
: 프로그램을 실행하는 도중에 발생하는 에러이며, 소스코드 상의 문제가 없음에도 발생한다.(사용자의 잘못으로 발생하거나 개발자가 경우의 수를 처리하지 않음)
(2) 해결 방법
: 예외 처리를 통해 해결한다.
2. 예외 처리
(1) 예외
: 시스템 에러를 제외한 에러를 말하며, 주로 런타임 에러를 다룬다.
(2) 예외 처리
: 예외가 발생했을 때 프로그램이 비정상적으로 종료되는 것을 막기 위해 예외를 처리하는 방법을 정의해둔 것
(3) RuntimeException 클래스(부모 클래스)
: Unchecked Exception에 해당하며, 이의 예외는 충분히 예측 가능하므로 예외 처리가 필수는 아니다.
① RuntimeException의 자식 클래스
ⓐ ArrayIndexOutOfBoundsException 클래스
: 배열의 인덱스 범위를 벗어나서 참조한 경우에 발생한다.
이때, '배열명.length'를 사용하여 배열의 범위를 확인한다.
ⓑ ClassCastException 클래스
: Cast 연산자를 사용했을 때 허용할 수 없는 형변환이 진행된 경우에 발생한다.
이때, instanceof 연산자로 객체 타입을 확인한 후 cast 연산을 한다.
ⓒ NullPointerException 클래스
: 참조 변수가 null인데도 객체 멤버를 참조하려고 할 경우에 발생한다.
이때, 객체를 사용하기 전에 참조 변수가 null인지 확인한다.
ⓓ ArithmeticException 클래스
: 0으로 나눌 때 발생한다.
이때, if문으로 나누는 수가 0인지 검사한다.
ⓔ NegativeArraySizeException 클래스
: 배열의 크기를 음수로 지정했을 경우에 발생한다.
이때, 배열의 크기를 0보다 크게 지정해야 한다.
② 관련 예외
ⓐ 예외가 예측 가능한 상황일 때엔 조건문으로 해결하는 것을 권장한다.
ⓑ 예외가 예측 불가한 상황일 때엔 예외 처리 구문으로 해결한다.
(4) 예외 처리 방법
① 메소드를 선언할 때 throws ExceptionName문을 추가하여 호출한 상위 메소드에 처리를 위임한다.
만약, 계속 호출한 메소드에 위임하여 main()까지 가서 이 main()에서도 처리하지 않으면 비정상적으로 종료된다.
② try ~ catch문을 이용하여 예외를 처리한다.
public static void main(String[] args) { // method3의 예외를 try ~ catch문으로 처리
Test t = new Test();
try {
t.method1();
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println("프로그램을 종료합니다.");
}
}
public void method1() throws IOException { // main()에 처리 위임
method2();
}
public void method2() throws IOException { // method1()에 처리 위임
method3();
}
public void method3() throws IOException { // Exception 발생 -> method2()에 처리 위임
throw new Exception();
}