코딩과 결혼합니다

230921 - 자바의 정석 chapter 08 본문

2세/Java

230921 - 자바의 정석 chapter 08

코딩러버 2023. 9. 21. 17:02
728x90

⭐프로그램 오류

     - 프로그램 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있다.

     - 이러한 결과를 초래하는 원인을 프로그램 에러 또는 오류라고 한다.

  • 컴파일 에러 : 컴파일 시에 발생하는 에러
  • 런타임 에러 : 실행 시에 발생하는 에러
  • 논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것
에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외 : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

 

 

 

⭐예외 클래스의 계층 구조

  • Exception 클래스와 그 자손들 - 'checked 예외' (예외 처리 필수)
    • 사용자가 발생하는 예외
    • 입력된 데이터 형식이 잘못된 경우, 존재하지 않는 파일의 이름을 입력하는 경우...
  • RuntimeException 클래스와 그 자손들 - 'unchecked 예외' (컴파일러가 예외 처리 여부를 확인하지 x, 예외 처리 선택)
    • 프로그래머의 실수로 발생하는 예외
    • 배열의 범위를 벗어나는 경우, 클래스 간의 잘못된 형 변환을 하는 경우...

 

 

⭐예외 처리 하기(try - catch 문)

      - 정의 : 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것

      - 목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행 상태를 유지하는 것

  • 하나의 try 블럭 다음에 여러 종류의 예외 처리를 할 수 있도록 하나 이상의 catch블럭이 올 수 있다.
  • 이 중 발생한 예외의 종류는 일치하는 단 한 개의 catch 블럭만 수행된다.
  • 발생한 예외의 종류와 일치하지 catch문이 없으면 예외는 처리되지 않는다.
  • if 문과 달리, try 블럭이나 catch 블럭 내에 포함된 문장이 하나뿐이어도 중괄호{}를 생략할 수 없다.

 

 

⭐try - catch 문에서의 흐름

  • try 블럭 내에서 예외 발생
    • 1. 발생한 예외와 일치하는 catch 블럭이 있는지 확인
    • 2. 일치하는 catch 블럭을 찾게 되면, 그 catch 블럭 내의 문장들을 수행하고 전체 try -catch 문을 빠져나가서 그 다음 문장을 계속해서 수행한다.\
  • try 블럭 내에서 예외가 발생하지 않은 경우
    • catch 블럭을 거치지 않고 전체 try-catch문을 빠져 나가서 수행을 계속한다.

 

 

⭐예외의 발생과 catch 블럭

  • printSrackTrace() : 예외 발생 당시의 호출 스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
  • getMessage() : 발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.

 

  • 멀티 catch 블럭
    • JDK 1.7부터 여러 catch블럭을 'ㅣ'기호를 이용해서, 하나의 catch블럭으로 합칠 수 있게 되었다.
    • 즉, 내용이 같은 catch블럭을 하나로 합친 것이다.
    • 'ㅣ'기호로 연결할 수 있는 예외 클래스의 개수에는 제한이 없다.
    • 단, 조상과 자손의 관계에 있다면 합칠 수 없다.(컴파일 에러)
    • 멀티 catch 블럭의 참조변수로는 공통 멤버만 사용할 수 있다.

 

 

⭐예외 발생 시키기

    - 키워드 throw를 사용해서 프로그래머가 예외를 발생시킬 수 있다.

 

 

 

⭐메서드 예외 선언하기

  • 메서드의 선언부에 키워드 throw를 사용해서 메서드 내에서 발생할 수 있는 예외를 적는다. 그리고 예외가 여러 개인 경우 쉼표로 구분한다. 
  • 만약 모든 예외의 최고 조상인 Exception 클래스를 메서드에 선언하면, 이 메서드는 모든 종류의 예외가 발생할 가능성이 있다는 뜻이다.
  • 메서드의 throw에 예외를 명시하는 것은 예외 처리를 하라는 것이 아니라, 자신을 호출한 메서드에게 예외를 전달하여 예외 처리를 떠맡기는 것이다.

 

 

⭐finally블럭

     - 예외의 발생 여부와 관계없이 실행되어야 하는 코드

  • 선택적으로 사용할 수 있으며, try - catch - finally의 순서로 구성된다. 예외 미발생시에는 try - finally
  • try 또는 catch 블럭에서 return문을 만나도 finally블럭은 수행된다.

 

 

⭐자동 자원 반환 - try with resources문

  • JDK 1.7부터 try with resources 문이라는 try - catch 문의 변형이 추가되었다.
  • try with resources 문의 괄호 안에 객체를 생성하는 문장을 넣으면, try 블럭을 벗어나는 순간 자동적으로 close()가 호출된다. 그다음 catch 또는 finally 블럭이 수행된다.
  • try with resources 문에 의해 자동으로 close()가 호출될 수 있으려면 클래스가 AutoCloseable이라는 인터페이스를 구현한 것이어야 한다.

 

 

⭐ 사용자 정의 예외 만들기

     - 기존의 예외 클래스를 상속받아서 새로운 예외 클래스 작성

 

 

 

⭐예외 되던지기

     - 예외를 처리한 후에 다시 예외를 발생시켜 호출한 메서드로 전달

  • 예외가 발생한 메서드와 이를 호출한 메서드, 양쪽에서 예외를 처리해야 하는 경우에 사용한다.
  • 반환 값이 있는 return문의 경우, catch 블럭에도 return 문이 있어야 한다. 예외가 발생했을 경우에도 값을 반환해야 하기 때문이다.
  • catch 블럭에서 예외 던지기를 해서 호출한 메서드로 예외를 전달하면, return문이 없어도 된다.

 

 

⭐연결된 예외

    - 한 예외가 다른 예외를 발생시킬 수 있다.

  • 원인 예외 : 예외 A가 예외 B를 발생시켰다면 A를 B의 원인예외라 한다.
  • 여러 예외를 큰 분류의 예외로 묶을 때, 연결된 예외로 처리한다.
  • 필수 예외를 선택 예외로 변경할 때 연결된 예외로 처리한다.