JAVA 기초

[JAVA 기초] JAVA의 정석 - Ch.08 예외 처리(Exception handling) (정리)

beginner-in-coding 2025. 1. 16. 14:45

Ch.08 예외 처리(Exception handling)


-      예외 처리(exception handling)

  • 프로그램 오류
    • 프로그램이 실행 중에 어떤 원인에 의해 오작동하거나 비정상적으로 종료되는 것을 의미
    • 발생시점에 따른 오류 분류
      1. 컴파일 에러: 컴파일 시에 발생하는 에러
      2. 런타임 에러: 실행 시에 발생하는 에러
      3. 논리적 에러: 실행은 되지만, 의도와는 다르게 동작하는 것
    • 에러(error): 프로그램 코드에 의해 수습될 수 없는 심각한 오류
    • 예외(Exception): 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 부분
  • 예외 클래스의 계층 구조
    • 예외의 최고 조상: Exception 클래스
      • IOException  //입출력 예외
      • ClassNotFoundException  //클래스 파일 예외
      • RuntimeException 
        • ArithmeticException  //정수를 0으로 나눌 때
        • ClassCastException  //참조변수의 형변환 할 때
        • NullPointException  //null인 참조변수의 멤버를 호출하려고 할 때
        • IndexOutOfBoundsException   //배열의 인덱스 범위를 벗어날 떄  
    • Exception의 두 종류
      1. Exception 클래스와 그 자손들(RuntimeException 제외)
        • 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
        • 예외 처리 필수(checked)
      2. RunTimeException 클래스와 그 자손들
        • 프로그래머의 실수와 같은 외적인 요인에 발생하는 예외
        • 예외 처리 선택(unchecked)
  • 예외 처리하기 – try-catch
    • 정의: 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
    • 목적: 프로그램의 비정상적인 종료를 막고, 정상적인 실행 상태를 유지하는 것
    • 발생한 예외를 처리하지 못하면 JVM의 예외처리기(UncaughtExceptionHandler)가 받아서 예외의 원인을 화면에 출력
  • Try-catch문에서의 흐름
    • try블럭 내에서 예외가 발생한 경우
      1. 발생한 예외와 일치하는 catch블럭이 있는지 아래서부터 순차적으로 확인
      2. 일치하는 catch블럭을 찾으면 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행
      3. 만약 예외 발생 후 일치하는 catch블럭을 찾지 못하면 예외 처리는 수행되지 않음
    • try블럭 내에서 예외가 발생하지 않은 경우
      1. try블럭을 마무리하고 try-catch문을 빠져나가 이어서 다음 문장을 수행
  • 예외 발생과 catch블럭
    • printStackTrace()  //예외 당시의 호출 스택(Call Stack)에 있었던 메서드의 정보와 예외 메세지를 화면에 출력
    • getMessage()  //발생한 예외 클래스의 인스턴스에 저장된 메세지를 얻을 수 있음
    • 멀티 catch 블럭
      • 하나의 catch블럭으로 예외를 묶는 방법
      • '|' 로 catch 블럭에 예외를 연결해서 선언
      • 연결 개수에는 제한이 없음
      • '|'기호로 연결된 예외들이 부모와 자손의 관계에 있다면 컴파일 에러 발생  →  조상 클래스만 쓰는 것과 같은 의미
  • 예외 발생시키기
    • 키워드: throw
      1. 연산자 new를 이용해서 발생시키려는 예외 클래스를 선언
        • 인스턴스를 생성할 때, 생성자에 String을 넣어 정보를 전달하면 예외를 발생시켰을 때 getMessage()를 통해 얻을 수 있음 
      2. throw를 이용해서 예외를 발생
  • 메서드에 예외 선언하기
    • 키워드: throws
    • void method throws Exception {  //메서드의 내용  }  //메서드 안에서 발생시킬 수 있는 예외
    • 예외가 선언된 메서드를 호출할 때는 예외 처리를 해야한다는 의미
  • finally 블록
    • try-catch문의 예외 처리 발생과 상관 없이 실행되어야하는 코드를 포함 시킴
    • try {  //예외 확인할 내용  } catch (Exception e) {  //예외가 발생했을 경우  } finally {  //발생여부와 상관없이 항상 수행  }
  • 자동 자원 변환 – try-with-resource
    • 입출력(I/O)과 관련된 클래스를 사용할 때 유용
    • 입출력은 사용 후 닫아줘야 자원(resource)을 반환하기 때문
    • try-catch문을 개선한 것
    • try의 괄호()안에 객체를 생성하는 문장을 넣으면 try문을 벗어나는 순간 자동으로 close()를 호출
      • 자동으로 호출하기 위해 interface AutoCloseable을 구현한 것이여야함
  • 사용자정의 예외 만들기
    • 기존의 예외 클래스를 상속(extends)받아서 새로운 예외 클래스를 정의 가능
    • 예외 처리 필수인 Exception보다 예외 처리 선택인 RuntimeException을 사용하는 것을 권장
  • 예외 되던지기(exception re-throwing)
    • 의미: 예외를 처리한 후에 인위적으로 다시 발생시키는 것
    • 사용 이유: 하나의 예외에 대해서 예외가 발생한 곳과 호출한 곳 양쪽에서 처리해야 하는 경우
    • try-catch문의 catch문에서 throw를 통해 예외를 재발생
  • 연결된 예외(chained exception)
    • 한 예외가 다른 예외를 발생시키는 것
      • 예외 A가 예외 B를 발생킴  → A를 B의 원인예외(cause Exception)라고 정의
    • 사용 이유
      1. 여러가지 예외를 하나의 큰 예외로 다루기 위해
      2. 조상 예외를 catch문에 작성하면 조상 예외 발생인지 자손 예외 발생인지 구분할 수 없기 때문에
      3. 예외 처리 필수를 예외 처리 선택으로 변환하기 위해
    • RuntimeException(Trowable casue)
      • 원인 예외를 등록하는 생성자
      • RuntimeException으로 원인 예외를 감쌌기 때문에 예외 선택 처리가 됨