JAVA 예외(Exception) 정복하기
자바에서 예외(Exception)는 프로그램의 실행 도중에 발생할 수 있는 비정상적인 상황을 말한다.
예외는 일반적으로 프로그램이 실행 중에 예상치 못한 오류 상황이나 예외적인 조건에 직면했을때 발생한다.
예외가 발생하면 프로그램이 종료될 수 있지만, 예외 처리를 통해 실행 상태를 유지하고 적절한 조치를 취할 수 있다.
💡 예외의 종류
-
일반 예외 (Exception)
컴파일러가 예외 처리 코드 여부를 검사하는 예외를 말한다.
IOException
와 같은 파일 조작시 발생하는 예외가 여기에 속한다. -
실행 예외 (RuntimeException)
컴파일러가 예외 처리 코드 여부를 검사하지 않은 예외를 말한다.
NullPointException
과 같은 런타임시 발생하는 예외가 여기에 속한다.
💡 예외의 흐름
예외가 발생하면 해당 예외 클래스의 객체가 생성되고 이 객체는 호출 스택을 따라 메서드들을 거슬러 올라가면서 예외를 처리할 수 있는 try-catch
블록을 찾는다. 만약 호출 스택 맨 위 main()
까지 예외를 처리 할 수 없는 블록이 없다면 프로그램은 비정상 종료되고, 예외에 대한 정보가 출력된다.
-
예외 발생
프로그램이 실행 중에 어떤 이유로 예외가 발생한다. -
예외 객체 생성
예외가 발생하면 해당 예외 클래스의 객체가 생성된다. -
호출 스택 검색
예외가 발생한 지점부터 호출 스택을 따라 올라가며try-catch
블록을 찾는다. -
처리 가능한 블록 발견
호출 스택을 따라 올라가면서 예외를 처리할 수 있는try-catch
블록을 찾으면 해당 블록이 실행된다. -
예외 처리
찾은catch
블록에서 예외를 처리한다. -
처리 가능한 블록이 없을 경우
호출 스택의 맨 위까지 예외를 처리할 수 있는 블록이 없다면 프로그램은 비정상 종료된다.
public class ExceptionExample {
public static void main(String[] args) {
try {
methodA();
} catch (CustomException e) {
System.out.println("Caught CustomException: " + e.getMessage());
}
}
public static void methodA() {
try {
methodB();
} catch (NullPointerException e) {
System.out.println("Caught NullPointerException: " + e.getMessage());
}
}
public static void methodB() {
throw new CustomException("Custom Exception in methodB");
}
}
class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}
methodB
에서CustomException
예외를 발생 시켰다.- 호출 스택을 따라 올라가며
try-catch
블록을 찾는다. methodB
에서 발생한 예외를 처리할 수 있는try-catch
블록은methodA
블록에있다.methodA
의catch
블록의 의해 예외가 처리된다.
📌 만약 methodA
에 try-catch 블록이 없다면?
만약 methodA
에 try-catch
블록이 없다면, 예외는 main
메서드로 전파된다.
이 경우 main
메서드에서도 try-catch
블록이 없다면 예외는 최종적으로 스레드의 실행을 중단하고
예외 정보를 출력한 후 프로그램이 종료된다.
public class ExceptionExample {
public static void main(String[] args) {
try {
methodA();
} catch (CustomException e) {
System.out.println("Caught CustomException in main: " + e.getMessage());
}
}
public static void methodA() {
methodB();
}
public static void methodB() {
throw new CustomException("Custom Exception in methodB");
}
}
class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}
댓글남기기