java

[Java] 예외처리, throwable이란/ try,catch,throw,finally란?

윤밥밥 2023. 10. 26. 19:07
  • Throwable

    • 예외가 발생하면 해당 예외에 해당하는 예외 클래스의 인스턴스를 생성한다.
    • Object 클래스를 제외하고 예외처리의 최상위 클래스는 Throwable이다
    • 예외 처리에서 자주 사용되는 메소드
      • public String getMassage()
        • 예외의 원인을 담고 있는 문자열을 반환
      • public void printStackTrace()
        • 예외가 발생한 위치와 호출된 메소드의 정보를 출력
    • Throwable클래스를 상속하는 클래스는 주로 세가지
        • Error 클래스
          • 에러 클래스를 상속하는 예외는 IOError, VirtualMarchineError등으로 우리가 처리할 수 없는 에러이다.
          • 즉 프로그램이 종료되도록 그냥 놔둬야 한다.
        • RunTimeException 클래스
          • 이는 사용자가 처리할 수 있는 에러가 아니다.
        • Exception 클래스
          • Exception 클래스만 상속하는 에러 try catch문으로 반드시 처리를 해야한다
          • throws
            • 대부분의 예외는 Exception이 받아준다.
            • 메소드 끝에 throws 예외명을 붙여준다.
            • 현재 영역에서 일어난 예외를 다른 영역에서 처리하도록 한다.
            • 그럼 이 영역을 부른 곳에서 try catch가 존재하고, 이 catch에서 잡던가, 아니면 다시 throws를 한다.
            • # 만약 main함수에서까지 throw를 안받아주면 어떻게 될까
              • main은 JVM(java virtual marchine)이 호출하므로
              • 해당 언어의 런타임이 언제나 프로그램 가장 바깥에 예외 핸들러(처리자)를 둬서 사용자의 코드가 잡지 못한 모든 예외를 잡도록 하고 있습니다.
  • try, throw, catch, finally

    try {
         시도할 코드
    } catch(받을 예외 객체) {
         예외 발생 시 내용 작성
    } finally {
        무조건 실행할 코드
    }
    
    • try

      • 이 안에 시도하고 싶은 코드를 작성한다.
    • throw

      • 내가 예외를 던지고 싶을 때 사용한다.
      • throw new FoolException()
      • 예외 객체를 던진다.
        • 예외 객체를 직접 만들 수 있다.
          • 이 땐 최상위 객체 Eception을 상속받으면 된다.
    • catch

      • 기본적으로 try하다 발생한 예외는 catch가 처리한다.
      • 즉 예외가 발생하지 않으면 catch도 발생하지 않는다.
      • catch의 매개변수에는 예외 객체를 적는다.
        • 참고로 예외가 발생하면 시스템이 예외 객체를 만들어 던진다
    • finally

      • 예외랑 상관없이 무조건 실행하는 코드
      • 제일 마지막에 실행된다.
  • 자바의 예외 처리 방법

    • 1) try-catch (finally) - 다른 작업 흐름으로 유도
    • 2) throws - 호출한 쪽(부모)에게 예외 처리 위임하도록
    • 3) throw - 명확한 의미의 예외로 바로 처리 ==> 개발자들이 비즈니스 로직에서 처리하는 방식임!
      1. RUNTIMEEXCEPTION은 throws를 명시할 필요가 없다. 왜냐하면 이 예외는 사용자가 해결할 수 없는 예외이기에 throws를 명시하여도 이를 catch할 수 업기 때문이다. 반면에 EXCEPTION은 사용자가 처리할 수 있기에 throws를 명시해야하는 것이다.
      1. throw만 하고 끝까지 catch를 안 받아도 된다. main은 JVM(java virtual marchine)이 호출하므로 해당 언어의 런타임이 언제나 프로그램 가장 바깥에 예외 핸들러(처리자)를 둬서 사용자의 코드가 잡지 못한 모든 예외를 잡도록 하고 있기 때문이다.