231203 YIL 오류와 예외에 관하여

HR J·2023년 12월 6일
0

스프링 훈련

목록 보기
5/8

이번에는 예외와 오류에 관하여 복습을 해보고자 한다.

자바 코딩을 하다보면 결코 피할 수 없는 두 가지가 바로 오류와 예외이다.

오류(Error)

  • 일반적으로 회복이 불가능한 문제.
  • 보통 시스템 레벨, or 환경적인 이유로 발생.
  • 코드 문제도 있지만 회복 불가능.
  • 에러가 발생한 경우 우리는 어떠한 에러로 프로그램이 종료되었는지를 확인하
    고 대응.

예외(Exception)

  • 일반적으로 회복이 가능한 문제.
  • 회복 가능하다 함은, 예외가 발생할 수 있다는 것을 인지하고 대응할 수 있다는 뜻.
  • 코드레벨에서 문제상황 대응은 '예외처리'에 속함.

컴파일 에러

  • .java 파일을 .class 파일로 컴파일할때 발생하는 에러.
  • 대부분 여러분이 자바 프로그래밍 언어의 규칙을 지키지 않았기 때문에 발
    생.
  • 존재하지 않는 클래스를 호출한다거나, 접근이 불가능한 프로퍼티나
    메소드에 접근한다거나 하는 경우에 발생.
  • 해결방법 : 문법에 맞게 다시 작성!

런타임 에러

  • 코딩시 자주 접하게 될 에러(예외).
  • 문법적인 오류는 아니라서, 컴파일은 잘 되었지만 “프로그램”이 실행 중 생기는 예외.

미확인된 예외

  • 런타임 시점에 확인되는 예외.
  • 예외 처리가 반드시 필요하지 않은 예외.

throws와 throw

예외에 관한 자바문법 중에 헷갈리는 문법이 있는데, 대표적인 문법이 바로 throw이다.

아래의 표는 어떤 차이점이 있는지 정리해놓은 표이다.

클래스 및 메서드를 만들며 우리의 메서드의 위험성 알리기(throw, throws)

처음에 위험성이라는 말이 선뜻 와닿지 않았다.
위험성이라는 말은 곧 오류가 발생할 가능성을 내포하고 있다는 뜻이 된다.
그것을 미리 알고 코딩으로 상황을 가정해 대처하는 것이 곧 '예외처리'이다.

  • 예측이 될 때, 바로 이 throw로 이 메서드가 위험함을 알린다.

예외 Handling

1. 위험 감지하기

특정한 클래스의 메서드를 사용할 때, 특히 우리가 작성한 코드가 아니
라면 더더욱, 이 메서드가 위험한지 알아봐야 한다.

2. try-catch(finally) 키워드 이용하기

  • try - catch 는 각각 중괄호 {} 를 통해 실행할 코드들을 담는다.
  • try : 중괄호 {} 안에는 예외가 발생할 수 있지만 실행을 시도할 코드!
  • catch : 중괄호 {} 안에는 try 안에있는 코드를 실행하다가 예외가 났을때 실행할 코드!
    -- catch 는 소괄호 () 를 통해 어떤 예외클래스를 받아서 처리할지 정의해
    주어야 함!
    -- catch 로 모든 예외를 다 받고 싶으면 Exception 을 넣어주면 된다.
    -- catch 로 일부 예외만 받아서 처리하고 싶으면 해당 예외 클래스명을 넣어
    주면 된다!
    -- 1개의 try 문에 catch 문은 여러개 사용할 수 있습니다. ex) 1 try : 4 catch
  • 기존 try - catch 의 맨 마지막에 finally 를 붙여서 마지막에 반드시 실행할 코드를 넣을 수 있음

객체지향성을 가지는 자바언어답게, 위와 같이 “문제”를 추상화해서 객체와 상속관계를 이용해 구현할 수 있다.

java의 throwable class?

  • 시작은 모든 객체의 원형인 Object 클래스에서부터!
  • “문제 상황”을 뜻하는 Throwable 클래스가 Object 클래스를 상속한다.
  • Throwable 클래스의 자식으로 앞서 배운 에러( Error )와 예외( Exception ) 클래스가 있다.
  • 에러( Error ) 클래스와 예외( Exception ) 클래스는 각각 IOError 클래스, RuntimeException 클래스와 같이 구분하여 처리.

위 그림의 RuntimeException을 상속한 예외들은 UncheckedException, 반대로 상속하지 않은 예외들은 CheckedException으로 구현되어 있다.

  • 즉 NullPointException, ArrayIndexOutOfBoundsException 등의 예외 구현체들은 명시적인 에러처리를 하지 않아도 컴파일 에러가 발생하지는 않는다.

  • Checked Exception에 속하는 에러 구현체들은 핸들링 하지 않으면 컴파일 에러가 발생하는 대신, 컴파일이 됐다면 100% 복구가 가능한 에러인 셈이다!

  • 자바의 에러 구현체들 예시

Chained Exception, 실제 예외 처리하는 방법

연결된 예외 (Chained Exception)

  • 예외는 다른 예외를 유발할 수 있다!
  • 예외 A가 예외 B를 발생시켰다면, 예외 A는 B의 원인 예외.
  • 원인 예외를 새로운 예외에 등록한 후 다시 새로운 예외를 발생시키는데,
    이를 예외 연결이라 한다.

예외 연결하는 이유?

  • 여러 가지 예외를 하나의 큰 분류의 예외로
    묶어서 다루기 위함!

  • checked exception은 unchecked exception으로 포장(wrapping)
    하는데 유용하게 사용되기도 한다.

  • 원인 예외를 다루기 위한 메소드
    -- initCause() : 지정한 예외를 원인 예외로 등록하는 메소드
    -- getCause() : 원인 예외를 반환하는 메소드

profile
Newbie Engineer&Programmer

0개의 댓글