LostCatBox

Java 배우기 CH08

Word count: 607Reading time: 3 min
2022/12/23 11 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. 예외처리