LostCatBox

Java 배우기 CH08

Word count: 607Reading time: 3 min
2022/12/23 Share

예외처리

프로그램 오류

  • 컴파일 에러(compile-time error): 컴파일 할떄 발생하는에러
    (실행불가)
    • 자바 컴파일러가 하는일
      • 구문체크
      • 번역
      • 최적화
        (간단한 계산은 해놓음)(extends Object같은것넣어줌)
  • 런타임 에러(runtime error): 실행할 때 발생하는 에러
    (실행중 프로그램종료)
    (컴파일할때는 논리적으로는 통과했던것)
  • 논리적 에러(logical error): 작성 의도와 다르게 동작
    (프로그램 종료X, 의도와 다르게 오류생김)

자바의 런타임 에러(실행중 발생하는 에러)

  • 에러(error) = 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
    ex) out of memory
  • 예외(exception) = 프로그램 코드에 의해서 수습될수있는 다소 미약한 오류
  • 예외처리의 정의와 목적 >> 비정상적인 종료 막고, 정상적인 실행상태 유지 목적

스크린샷 2022-05-17 오후 5.38.29.png

예외 클래스의 계층 구조

  • 아래는 상속계층도 확인
  • 특히 Exception(미약한 오류)는 크게 2가지로 구분
    • Exception과 그 자손들
    • RuntimeException과 그 자손들
      (물론 Exception의 자손이긴함)

스크린샷 2022-05-17 오후 5.42.49.png

Exception과 RuntimeException

스크린샷 2022-05-17 오후 5.47.08.png

예외 처리하기 & try-catch문의 흐름

  • try-catch문은 { }생략 불가
  • try는 시도할 문장
  • catch는 각각 예외를 적어놓고, 이를 처리하기위한 문장

스크린샷 2022-05-17 오후 5.51.45.png

  • try문 도중 예외 발생시 바로그순간 catch문 찾아 실행!!!
    그후 try문 전부 빠져나옴
    만약 해당 예외의 catch 없다면, 즉시 프로그램 비정상 종료
    (예외발생순간 그아래 문장은 실행되지않는다.)

    스크린샷 2022-05-17 오후 5.56.14.png

  • 만약 catch(Exception e) {} 활용시 모든 예외의 조상이므로 모든 예외 처리가능
    따라서 catch문의 제일 마지막에!! 배치하자

printStackTrace(), 멀티 catch블럭

  • 예외 발생시 해당 예외의 객체가 만들어짐>> 예외 정보 + 메서드 포함됨
  • 참조변수가 예외 객체를 가르킴 >> 스코프(유효범위)는 발생된 해당 catch문
  • 아래 예외 객체에 들어있는 메서드중요(!!!)
    • printStackTrace()
    • getMessage()

스크린샷 2022-05-17 오후 6.13.57.png

멀티 catch블럭

  • 내용이 같은 catch블럭들을 하나로 합친것(JDK1.7부터)
  • catch ( 예외1 | 예외2) {구현문} 으로 여러예외를 한번에 처리가능
  • 부모자식은 부모만 쓰기(자식도있다면 컴파일 에러 발생)
  • 예외처리시 구현문에 어떤 예외에 해당하는 객체가 생성되었을지모름
    • 멀티 예외 객체의 공통 멤버만 호출가능
    • 또는 instanceof로 체크후 형변환하면,
      특정객체의 멤버 호출가능

Untitled

Untitled

예외 발생시키기

  • 예외 클래스의 객체를 만들기 throw로 발생 시킨후 catch로 잡기가능

Untitled

예외의 종류 (checked예외, unchecked예외)

  • checked예외: 컴파일러가 예외 처리 여부를 체크(예외 처리 필수)
    Exception과 그 자손 >>try-catch문 필수
  • unchecked예외: 컴파일러가 예외 처리 여부를 체크 안함(예외 처리 선택) >>try-catch문 선택
    RuntimeException과 그 자손

Untitled

checked에외, unchecked예외 나눠놓은이유
배열, 참조변수 모두 null과 배열범위 벗어날 에러도 가능함..그럼 사용할떄마다 다할수없으므로!

Untitled

메서드에 예외 선언하기

  • 예외를 처리하는 방법:
    • try-catch문(=직접처리)
    • 예외 선언하기(=예외 떠넘기기)
    • 은폐 덮기
  • 메서드가 호출시 발생가능한 예외를 호출하는 쪽에 알리는것

스크린샷 2022-05-19 오후 1.18.22.png

스크린샷 2022-05-19 오후 1.18.33.png

  • startInstall() 메서드를 실행시 발생가능한 예외를 throws로 적어놓고, 발생시 이 메서드를 호출한 쪽에 try-catch문이있던가, 다시 떠넘길수있다.

  • throws에는 필수처리해야하는 checked Exception만 적는다.
    RuntimeExcption은 선택예외이므로 필요없다

  • 예시
    떠넘기기 + try-catch문을 구현안해놓으면 main()>결국 JVM에게 넘김

    스크린샷 2022-05-19 오후 1.24.45.png

  • 예시2

스크린샷 2022-05-19 오후 1.31.11.png

  • main>createFile> main (예외 떠넘김)

finally블럭

  • 예외 발생여부와 관계없이 수행되어야 하는 코드를 넣는다.

  • 스크린샷 2022-05-19 오후 2.45.14.png

사용자 정의 예외 만들기

  • 우리가 직접 예외 클래스를 정의할 수 있다.
  • 조상은 Exception(사용자발생)과 RuntimeException(프로그래머의 실수로 발생)중에서 선택
  • 조상 예외 클래스의 생성자를 호출한다.
    이때 문자열 매개변수로 받는 생성자 꼭 생성

예외 되던지기(exception re-throwing)

  • 예외를 처리한 후에 다시 예외를 발생시키는것
  • 호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리하는것

스크린샷 2022-05-19 오후 3.28.27.png

연결된 예외(chained exception)

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

  • 즉, 예외안에 또다른 예외를 포함시키는것

  • 예외 A가 예외 B를 발생시키면,
    A는 B의 원인 예외(cause exception)

  • 예시)
    실제로 발생한것은 SpaceException인데 이를 InstallException으로 포함시킴>> 포함시켜서 다른 호출했던 함수로 예외넘김

스크린샷 2022-05-19 오후 3.42.00.png

연결된 예외 사용 이유1

  • 여러 예외를 하나로 묶어서 다루기 위해서 (세부예외를 포괄예외로처리)

  • 여러개가있다면, catch블록이 계속 생김. 하지만 하나로 묶으면 코드 간결화

  • 호출하는 함수에 예외를 모두 포함하여 포함된것에 대한 예외를 반환

  • 스크린샷 2022-05-19 오후 3.49.12.png

  • 대략정보 + 세부정보로 표현가능

스크린샷 2022-05-19 오후 3.56.55.png

연결된 예외 사용이유2

  • checked에외를 unchecked예외로 변경하려 할때.
    (필수처리>>선택처리로 변경시)

  • 원인 예외로 등록 RuntimeException생성자 활용
    Space, Memory 둘다 Exception 예외이므로 필수처리 필요함.
    이를 RuntimeException 예외 선택처리로 원인 예외 등록시 선택처리

    스크린샷 2022-05-19 오후 4.00.26.png

  • try-catch문을 안써도되는데, 써야할때 활용

CATALOG
  1. 1. 예외처리
    1. 1.1. 프로그램 오류
    2. 1.2. 자바의 런타임 에러(실행중 발생하는 에러)
    3. 1.3. 예외 클래스의 계층 구조
    4. 1.4. Exception과 RuntimeException
    5. 1.5. 예외 처리하기 & try-catch문의 흐름
    6. 1.6. printStackTrace(), 멀티 catch블럭
    7. 1.7. 멀티 catch블럭
    8. 1.8. 예외 발생시키기
    9. 1.9. 예외의 종류 (checked예외, unchecked예외)
    10. 1.10. 메서드에 예외 선언하기
    11. 1.11. finally블럭
    12. 1.12. 사용자 정의 예외 만들기
    13. 1.13. 예외 되던지기(exception re-throwing)
    14. 1.14. 연결된 예외(chained exception)
      1. 1.14.1. 연결된 예외 사용 이유1
      2. 1.14.2. 연결된 예외 사용이유2