ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바의 정석] Ch.8 예외처리
    스터디플래너/공부하기 2022. 3. 22. 23:02

     

    1. 예외처리(exception handling)
      1. 프로그램 오류
        1. 프로그램 실행 중 어떤 원인에 의해 오작동하거나 비정상적으로 종료되는 경우 → 프로그램 에러/오류
        2. 프로그램 오류는 발생시점에 따라 컴파일 에러(compile-time error)와 런타임 에러(runtime error)로 나눔
          1. 컴파일 에러(compile-time error): 컴파일 할 때 발생하는 에러
          2. 런타임 에러(runtime error): 프로그램 실행도중에 발생하는 에러
          3. 논리적 에러(logical error): 실행되지만 의도한 것과 다르게 동작하는 에러
        3. 컴파일이 잘 되었어도 실행중 에러에 의해 잘못된 결과를 얻거나 비정상적으로 종료될 수 있음. 자바에서 실행 시(runtime) 발생할 수 있는 프로그램 오류를 에러(error)와 예외(exception)로 구분
          1. 에러(error): 스택오버플로우(StackOverflowError), 메모리 부족(OutOfMemoryError)과 같이 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
          2. 예외(exception): 프로그램 코드에 의해서 수습이 될 수 있는 덜 심각한 오류
      2. 예외클래스의 계층구조
        1. 모든 클래스의 조상은 Object → Exception과 Error 클래스도 Object 클래스의 자손
        2. 예외 클래스는 Exception클래스와 그 자손들, RuntimeException클래스와 그 자손들로 나눌 수 있음
          1. RuntimeException클래스: 프로그래머의 실수에 의해 발생하는 예외
          2. Exception클래스: 프로그램 사용자의 동작과 같이 외적 원인때문에 발생하는 예외
      3. 예외처리하기 - try-catch문
        1. 예외처리(exception handling)란 프로그램 실행시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것
        2. 예외처리의 목적은 예외가 발생하여 프로그램이 비정상적으로 종료되거나 잘못된 결과를 막아 정상적인 실행상태를 유지하는 것
        3. 예외가 발생할 것 같은 문장은 try블럭{}안에 작성하고, 예외가 발생했을 때 처리하기 위한 문장은 catch블럭{}안에 작성
      4. try-catch문에서의 흐름
        1. try블럭{} 내에서 예외가 발생한 경우
          1. 발생한 예외와 일치하는 catch블럭이 있는지 확인
          2. 일치하는 catch블럭을 찾은 경우, catch블럭 내 문장을 수행하고 전체 try-catch블럭을 빠져 나가서 그 다음 문장을 계속 수행
          3. 일치하는 catch블럭을 찾지 못한 경우, 예외 처리 불가
        2. try블럭{} 내에서 예외가 발생하지 않은 경우
          1. catch블럭을 거치지 않고 전체 try-catch블럭을 빠져 나가서 계속 수행
      5. 예외의 발생과 catch블럭
        1. catch블럭은 괄호()와 블럭{}으로 구성
        2. 괄호()내에 처리하고자 하는 예외와 같은 타입의 참조변수 선언
        3. 블럭{}에서는 괄호에서 선언한 예외캘래스의 인스턴스에 instanceof연산자를 이용하여 true인 블럭을 만날 때까지 검사
        4. 어떤 종류의 예외가 발생하더라도 catch블럭을 실행시키기 원한다면 여러개의 catch블럭 중 가장 마지막에 Exception클래스를 선언하여 처리
        5. 예외에 대한 정보를 얻을 수 있는 방법은 printStackTrace()와 getMessage()메소드가 있음
          1. printStackTrace()는 예외발생 당시 호출스택에 있었던 메소드의 정보와 예외 메세지를 화면에 출력
          2. getMessage():  발생한 예외 클래스의 인스턴스에 저장된 메세지
        6. 멀티 catch블럭
          1. JDK1.7부터 여러 catch블럭을 '|' 기호를 이용해서 하나의 catch블럭으로 합칠 수 있게 됨.
          2. '|' 기호로 연결된 예외 클래스가 조상과 자손 관계에 있다면 컴파일 에러 발생
      6. 예외 발생시키기
        1. 프로그래머가 'throw'를 사용해서 고의로 예외를 발생시킬 수 있음
        2. 컴파일러가 예외처리하지 않은 RuntimeException클래스들은 'unchecked예외'라 부르고, 예외처리를 확인하는 Exception클래스는 'checked예외'라 함
      7. 메서드에 예외 선언하기
        1. 메서드에 예외를 선언하기 위해서는 메서드의 선언부에 throw키워드를 사용하여 메서드에서 발생할 수 있는 예외를 기입
        2. 메서드의 선언부에 throw를 명시하여 예외를 선언하는 것은 직접 예외를 처리하는 것이 아니라 해당 메서드를 호출한 메서드에게 예외를 전달하여 예외처리를 떠맡기는 것
          1. 예외가 발생한 메서드 내에서 자체적으로 처리해도 되는 것은 메서드 내에서 try-catch문을 사용해서 처리
          2. 메서드에 호출 시 넘겨받아야 할 값을 다시 받아야 하는 경우 예외를 메서드에 선언하여 호출한 메서드에서 처리
      8. finally블럭
        1. finally블럭은 예외발생 여부와 관계 없이 실행되어야 할 코드를 포함시킬 목적으로 사용
        2. try블럭에서 return문이 실행되는 경우 finally블럭의 문장을 먼저 실행한 후 현재 메소드를 종료
      9. 자동 자원 반환 - try-with-resource문
        1. JDK1.7부터 try-catch의 변형으로 try-with-resources문이 추가
        2. try-with-resources문의 괄호()안에 객체를 생성하는 문장을 넣으면, 이 객체는 따로 close()를 호출하지 않아도 try블럭을 벗어나는 순간 자동적으로 close()가 호출
          1. try-with-resources문에 의해 자동으로 객체의 close()가 호출되기 위해서는 클래스 AutoCloseable이라는 인터페이스 구현이 필요함
      10. 사용자정의 예외 만들기
        1. Exception클래스와 RuntimeException클래스로부터 상속받아 만드는 클래스 외에도 필요에 따라 알맞은 예외 클래스를 선택할 수 있음
        2. 사용자정의 예외 클래스는 기존에 Excpetion을 상속받아 'checked예외로' 작성하였으나, 최근 예외처리를 선택적으로 할 수 있도록 RuntimeException을 상속받는 것으로 변화
        3. 필수적으로 처리해야 할 것 같았던 예외들이 선택적으로 처리해도 되는 상황으로 바뀌는 경우 발생
        4. 강제적인 'checked예외'에서 필요에 따라 예외처리를 선택할 수 있는 'unchecked예외'로 변화하고 있음
      11. 예외 던지기(exception re-throwing)
        1. 한 메서드에서 발생할 수 있는 예외가 여럿인 경우, try-catch문과 메서드로 나눠 양쪽에서 처리 가능한데, 이를 예외를 처리한 후 인위적으로 다시 발생시키는 예외 되던지기(exception-throwing)라 함
        2. 예외가 발생할 가능성이 있는 메서드에서 try-catch로 예외를 처리한 다음 catch문에서 필요한 작업을 처리한 다음 throw문을 사용해서 예외를 다시 발생시김
        3. 다시 발생한 예외로 이 메서드를 호출한 메서드에게 전달되고 기존 try-cathch문에서 예외를 처리
      12. 연결된 예외(chained exception)
        1. 예외 A가 예외 B를 발생시켰다면 A를 B의 원인 예외(cause exception)라 함. A가 B를 발생시킬 수 있음
        2. B 클래스를 생성한 후 initCase()로 원인 예외 등록
        3. initCause()는 Throwable클래스에 정의되어 있어 모든 예외에서 사용 가능

    1.2.2. RuntimeException클래스와 그 자손클래스, Exception클래스와 그 자손클래스로 나눌 수 있음
    0으로 정수를 나눌 때, ArithmeticException클래스의 인스턴스로 던진다.

    try{
    	//예외가 발생할 수 있는 문장
    }catch(Exception e){
    	//Exception이 발생했을 때 처리하기 위한 문장
    }
    Exception e = new Exception("예외 고의 발생");
    throw e;
Designed by Tistory.