자바(JAVA)/미니 프로젝트 & 기초 공부

Java 기초 또 다시 공부하기 15일차 - 예외 처리(예외 클래스, 예외 처리)

개발학생 2025. 6. 18. 16:25
반응형

예외(exception)

  • 사용자의 잘못된 조작 또는 개발자의 잘못된 코드로 인해 발생하는 프로그램 오류
  • 발생 시 프로그램이 곧바로 종료되는데,
    예외 처리(exception handling)를 통해 프로그램을 종료하지 않고 정상 실행 상태를 유지할 수 있음
  • 자바에서는 예외가 발생할 가능성이 높은 코드를 컴파일할 때 예외 처리 유무 확인(모든 예외를 확인하는 것은 아님)
    -> 예외 처리 코드가 없다면 컴파일되지 않음

1. 예외 클래스

  • 자바에서는 예외를 클래스로 관리
    -> 프로그램 실행 도중 예외 발생 시, JVM에서 해당 예외 클래스로 객체를 생성해야 예외 처리 코드에서 예외 객체 이용
  • 모든 예외 클래스는 java.lang.Exception 클래스를 상속받음

1) 예외와 예외 클래스

(1) 일반 예외(컴파일러 체크 예외, exception)

  • 프로그램 실행 시 예외가 발생할 가능성이 높으므로 자바 소스 컴파일 과정에서 해당 예외 처리 코드 유무 검사

일반 예외 도식화

(2) 실행 예외(컴파일러 넌[non] 체크 예외, runtime exception)

  • 프로그램 실행 시 예측할 수 없이 갑자기 발생하므로, 자바 소스 컴파일 과정에서 예외 처리 코드 유무를 검사하지 않음

실행 예외 도식화

2) 실행 예외

  • 자바 컴파일러가 체크하지 않으므로, 오로지 개발자의 경험으로 예외 처리 코드 작성
    -> 만약 개발자가 예외 처리 코드를 작성하지 않았다면, 실행 예외 발생 시 프로그램 종료

(1) NullPointerException

  • 객체 참조가 없는 상태에서 객체를 사용하려 했을 때의 예외
  • null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생

(2) ArrayIndexOutOfBoundsException

  • 배열에서 인덱스 범위를 초과할 경우의 예외
  • 예시로 길이가 3인 배열 arr을 선언했을 경우, arr[3]을 사용했을 때 발생 

(3) NumberFormatExceptioin

  • 문자열를 숫자로 변환하는 메서드들을 사용할 때, 문자열에 숫자로 변환될 수 없는 게 포함되어 있을 때의 예외

(4) ClassCastException

  • 상위클래스-하위클래스, 구현클래스-인터페이스 간의 관계가 아닌데, 클래스를 다른 타입으로 형변환하려 할 시의 예외

2. 예외 처리

  • 자바 컴파일러는 소스 파일 컴파일 시,
    일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 에러를 발생시켜 강제적으로 예외 처리 코드를 작성하도록 요구
    -> 자바 컴파일러가 실행 예외는 체크해주지 않으므로 예외 처리 코드를 작성해야 함
  • 실무에서 예외 클래스는 보통 Exception을 사용: 모든 예외를 확인 가능하기 때문

1) 예외 처리 코드(try-catch-finally 블록)

try {
  // 예외 발생 가능 코드
} catch(Exception e) {
  // 예외 발생 가능 코드에서 예외가 발생했을 때: 예외 처리
  e.printStackTrace();  // 예외의 상세 정보 출력
} finally {
  // 항상 실행하는 코드;
}

*다중 예외 처리 시(구체적인 예외를 구분해서 처리하는 것이 유지보수에 유리)

try {
  // 예외 발생 가능 코드
} catch (IOException e) {
  // 입출력 관련 예외 처리
  e.printStackTrace();  // 예외의 상세 정보 출력
} catch (SQLException e) {
  // DB 관련 예외 처리
  e.printStackTrace();  // 예외의 상세 정보 출력
} catch (Exception e) {
  // 그 외 예상치 못한 예외 처리 (로그 남기기 등)
  e.printStackTrace();  // 예외의 상세 정보 출력
}

2) 예외 떠넘기기(throws)

  • 메서드에서 처리하지 않은 예외를 호출한 곳으로 떠넘김
    -> 예외를 해당 메서드에서 직접 처리하지 않고, 메서드를 호출한 쪽에서 예외 처리를 책임지도록 위임
리턴타입 메서드이름(매개변수, ...) throws Exception {
}
반응형