[Java] 예외 처리 (Exception Handling)

ebebebbbebeb·2024년 10월 16일
post-thumbnail

예외 처리란? (Exception Handling)

프로그램 실행 시 발생할 수 있는 예기치 못한 예외를 대비한 코드를 작성하는 것

예외 처리의 목적

자바에서 코드를 예외 처리한다고 해서 프로그램의 예외 상황 자체를 막을 수 없음

  1. 예외 발생으로 인해 프로그램의 갑작스러운 비정상적인 동작을 막고
  2. 에러에 대한 복구 시도 or 회피 처리를 통해
  3. 프로그램의 정상적인 실행 상태 유지

에러(Error)와 예외(Exception)

넓은 의미에서는
프로그램 실행 시 발생할 수 있는 모든 문제들 ➡️ 에러

에러와 예외는 프로그래밍에서 엄밀히 말하면 차이가 존재

자바 프로그래밍에서는 실행 시(Run-time) 발생할 수 있는 오류를 에러예외 2가지로 구분

  • 에러(Error)
    • 한번 발생하면 복구하기 어려운 수준의 문제를 의미
    • ex) 메모리 부족(OutOfMemoryError), StackOverflowError
  • 예외(Exception)
    • 개발자의 잘못된 사용으로 인해 발생하는 에러, 상대적으로 크지않은 수준의 문제
    • (= 개발자의 실수)
    • 코드 수정으로 수습이 가능한 문제

∴ 예외 처리는 코드 수정으로 해결 가능한 문제를 처리하는 것

예외 클래스의 계층 구조

자바에서는 오류를 Error와 Exception으로 나눴고 이들을 클래스로 구현하여 처리하도록 하였음

예외가 발생하면 예외 클래스로부터 객체를 생성하여 해당 인스턴스를 통해 예외처리

IllegalArgumentException, NullPointerException과 IOException 모두 클래스

JVM은 예외가 발생하면 해당 예외 클래스로 객체를 생성하고, 예외 처리 코드에서 해당 인스턴스를 이용할 수 있도록 해줌

복잡한 버전

간단한 버전

자바에서 다루는 모든 예외 오류는 Exception class 에서 처리

위의 Exception 클래스 트리 구조를 보면 색깔별로 구분되어 있는데
컴파일 에러와 런타임 에러를 따로 클래스로 구분했기 때문

Exception 클래스는 RuntimeException과 그 외의 자식 클래스 그룹으로 나뉘어짐

Exception 및 하위 클래스

런타임 시 발생하는 에러를 제외한 모든 Exception 클래스와 하위 클래스들을 가리킴

컴파일러가 코드 실행 전에 예외 처리 코드 여부를 검사하기 때문에 Checked 예외라고 부르기도 함

주로

  • 잘못된 클래스명(ClassNotFoundException)
  • 존재하지 않는 파일 이름 (FileNotFoundException)
  • 잘못 입력한 데이터 형식(DataFormatException) 등

사용자의 편의 실수로 발생하는 경우가 많음

RuntimeException 클래스

런타임 시 발생하는 RuntimeException 클래스와 하위 클래스들을 가리킴

컴파일러가 예외 처리 코드 여부를 검사하지 않기 때문에 Unchecked 예외라 부르기도 함

  • 클래스 간의 잘못된 형변환(ClassCastException)
  • 배열의 범위를 벗어나는 경우(ArrayIndexOutOfBoundsException)
  • 값이 null인 참조 변수를 사용하는 경우(NullPointerException) 등

프로그래머의 실수로 인해 발생하는 케이스

명시적 예외 처리 의무

Checked / Unchecked Exception의 가장 핵심적인 차이
➡️ 반드시 예외 처리를 하는가?

Checked Exception

확인하는 시점이 컴파일 단계이기 때문에 별도의 예외처리를 하지 않으면
➡️ 컴파일 자체가 ❌

따라서 Checked Exception이 발생할 가능성이 있다면

반드시 try - catch or throws로 처리해줘야 한다!

Unchecked Exception

명시적인 예외 처리를 하지 않아도 👌

개발자의 충분한 주의로 미리 회피할 수 있는 경우가 대부분

상대적으로 약한 예외로 처리되어

자바 컴파일러가 별도의 예외 처리를 하지 않도록 설계되어 있기 때문

따라서 에러를 일부러 일으키는 코드가 있더라도
try - catch 처리하지 않더라도 컴파일에 실행까지 가능

2편에 계속...

0개의 댓글