프로그래밍의 오류
발생 시점에 따라 크게 3가지로 나눈다.
컴파일 에러(compile-time error)
컴파일 시 발생하는 오류
⭐️ 런타임 에러(runtime error)
실행 시 발생하는 오류
논리적 에러(logical error)
실행은 되지만, 의도와 다르게 동작하는 오류
= 버그
Error와 Exception 모두 Throwable 클래스를 상속받는다.
Error(에러)
프로그램 코드에 의해 수습될 수 없는 예측 불가한 심각한 오류
에러가 발생하면 프로그램이 종료된다.
주로 JVM에서 발생하는 문제로, 애플리케이션에서 직접 처리하거나 복구할 수 없다.
대표적인 에러
Exception(예외)
프로그램 코드에 의해 수습될 수 있는 예측 가능한 오류
예외가 발생했을 때 프로그램이 종료될 수 있지만, 예외 처리 코드를 통해 정상적으로 실행을 계속할 수 있다.
분류
Checked Exception - 컴파일 에러
자바 소스를 컴파일하는 과정에서 발생하는 예외
Exception을 상속받는다.
대표적인 컴파일 예외
Unchecked Exception - 런타임 에러
Runtime Exception(실행 예외)이라고도 불리며, 실행 시 발생하는 예외
RuntimeException을 상속받는다.
컴파일러가 체크를 하지 않기 때문에 오로지 개발자의 경험에 의해서 예외 처리를 해야 한다.
대표적인 런타임 예외
NullPointerException
null 값을 갖는 참조 변수로 객체 접근 시
String str = null;
System.out.println(str.length()); // NullPointerException
ArrayIndexOutOfBoundsException
배열의 범위를 벗어난 인덱스로 배열에 접근 시
int[] arr = new int[3];
System.out.println(arr[3]); // ArrayIndexOutOfBoundsException
NumberFormatException
숫자로 변환할 수 없는 문자열을 숫자로 변환 시
String str = "abc";
int num = Integer.parseInt(str); // NumberFormatException
ClassCastException
상속/구현 관계가 아닌 클래스 간 형변환 시
// Dog와 Cat은 Animal을 상속받는다.
Animal animal = new Dog();
Dog dog = (Dog) aninal;
Cat cat = (Cat) animal; // ClassCastException
→ instanceof
연산자를 사용하여 형변환 가능 여부를 먼저 확인해야 한다.
if (animal instanceof Cat) { // boolean
Cat cat = (Cat) animal;
}