✔️ 프로그램의 비정상적 종료를 방지하고, 정상적인 실행 상태를 유지하기 위한 코드 작성
자바에서는 런타임 시에 잠재적으로 발생할 수 있는 프로그램 오류를 에러와 예외로 구분해서 말한다.
에러(error): 복구하기 어려운 수준의 심각한 오류
ex) 스택 오버플로우(StackOverflowError), 메모리 부족(OutOfMemoryError)
예외(exception): 잘못된 사용 또는 코딩으로 발생하는 미약한 수준의 오류, 코드 수정 등을 통해서 수습이 가능함
ArithmeticException
: 특정 숫자를 0으로 나눴을 때 발생하는 예외FileNotFoundException
: 실제로 존재하지 않는 파일을 불러오려 시도할 때 발생하는 예외ArrayIndexOutOfBoundsException
: 배열의 범위를 벗어난 값을 불러오고자 시도할 때 발생하는 예외NullPointerException
: null에 .(포인터)
가 찍혔을 때 발생하는 예외우리는 코딩을 하다보면, 2가지 타입의 에러를 경험한다.
컴파일 에러
런타임 에러
말 그대로 컴파일 에러
는 컴파일 할 때 발생하는 에러이고, 런타임 에러
는 런타임 시에 발생하는 에러이다. 두 에러는 발생 시점이 다르다.
신택스 에러
라고 부르기도 한다.자바는 예외가 발생하면 예외 클래스로부터 객체를 생성하여 해당 인스턴스를 통해 예외처리를 한다.
Exception
클래스: 예외의 최상위 클래스ex) 잘못된 클래스명(ClassNotFoundException)이나 데이터 형식(DataFormatException) 등
ex) 클래스 간 형변환 오류(ClassCastException), 벗어난 배열 범위 지정(ArrayIndexOutOfBoundsException), 값이 null인 참조변수 사용(NullPointerException) 등
try {
// 예외가 발생할 가능성이 있는 코드
}
catch (ExceptionType1 e1) {
// ExceptionType1 유형의 예외 발생 시 실행할 코드
}
catch (ExceptionType2 e2) {
// ExceptionType2 유형의 예외 발생 시 실행할 코드
}
finally {
// finally 블럭은 옵션
// 예외 발생 여부와 상관없이 항상 실행
}
catch (NullPointerException e) {
// 구체적인 예외-1
}
catch (ArithmeticException e) {
// 구체적인 예외-2
}
catch (Exception e) {
// 모든 예외를 받음
}
catch 블럭이 여러 개인 경우, 블럭은 위에서부터 순차적으로 검사를 진행하며, 일치하는 하나의 catch 블럭만이 실행된다.
따라서 구체적인 하위 예외 클래스를 위에 배치하고, 상위 예외 클래스가 나중에 실행되도록 작성해야 한다!
일치하는 블럭을 찾으면, 예외처리 코드가 종료되거나 finally 블럭으로 넘어간다.
만약에 일치하는 블럭을 찾지 못하면, 예외는 처리되지 않는다.
catch (Exception e) {
System.out.println("e.getMessage: " + e.getMessage());
System.out.println("e.toString: " + e.toString());
e.printStackTrace();
}
e.getMessage()
e.toString()
e.printStackTrace()
-> 자세한 내용은 공부해서 추가해주기!