[Java] 에러와 예외 클래스

이병수·2024년 1월 9일
0

Java

목록 보기
21/27
post-thumbnail

에러와 예외 클래스


예외의 종류

코드 실행 관점

1. 컴파일 에러(예외)

  • .java 파일을 .class 파일로 컴파일 할 때 발생하는 에러

  • 대부분 문법적인 오류로 인해서 발생한다.

  • 예를 들어서 있지도 않은 클래스를 호출하거나, 접근 불가능한 메서드에 접근한다거나..

  • 컴파일 에러가 발생할 경우 문법에 맞게 다시 작성하면 된다.

  • 아주 좋은 예외 (바로 알 수 있기 때문이다.)

2. 런타임 에러(예외)

  • 문법적인 오류가 아니라서, 실행 도중 발생하는 에러이다.

  • 예외(Exception)처리 등을 통해 에러를 해결할 수 있다.


오류와 예외

자바 프로그래밍에서는 실행 시 발생할 수 있는 오류를 '에러(error)' 와 '예외(exception)' 두가지로 구분하였다.

에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류

예외 : 프로그램 코드에 의해서 수습될 수 있는 미약한 오류


에러는 메모리 부족(OutOfMemoryError)이거나 스택 오버플로우(StackOverflowError) 와 같이 발생하게 된다면 심각한 오류이고 예측이 불가능하다.
JVM 실행에 문제가 생겼기 때문에 개발자가 대처할 방법이 없다.

하지만 예외의 경우 개발자가 대처할 방법이 있다.
그러한 예외에 대해 개발자가 구현한 로직에서 대응 코드를 미리 작성하면 된다.

대응 코드 가 바로 try-catch(예외 처리 문법) 이다.


try-catch 문법

일단, 해당 코드를 작성하고 이 코드가 위험한지 체크를 해줘야한다. (미리 대응)

try {
	// 코드 작성
} catch( ) {
	// 코드 작성
}
  • try 문 안에 실행 할 로직을 작성해준다.

  • 이 로직 안에는 예외가 발생할 수 있는 코드가 포함되어 있다.

  • 만약 예외가 발생하게 된다면 그 이후로 로직은 더이상 수행되지 않으며, catch 문을 통해서 로직이 수행된다.


일단 이 위험 코드를 알리기 위해서 throw, throws에 대해 알아보자.

기능설명
throws메서드 이름 뒤에 붙어 이 메서드가 어떠한 예외사항을 던질 수 있는지 알려주는 예약어
throw메서드 안에서, 실제로 예외 객체를 던질때 사용하는 예약어
  • throw를 통해 던져지는 예외 객체로 인해 해당 코드 아래의 구문은 실행되지 않고 throw문과 함께 코드를 나가게 된다.

Throwable Class

오류와 예외 모두 자바의 최상위 클래스인 Object를 상속 받는다.
그리고 그 사이에는 Throwable 클래스와 상속관계가 있는데, Throwable 클래스의 역할은 오류나 예외에 대한 메세지를 담는 것이다.
대표적으로 getMessage() , printStackTrace() 메서드가 이 클래스에 속해있다.

  • 시작은 모든 객체의 최상위 클래스인 Object에서 시작한다.

  • Throwable 클래스는 Object 클래스를 상속한다.

  • Throwable 클래스의 자식으로 앞서 배운 Error(에러)와 Exception(예외) 클래스가 있다.

  • 그러한 Exception(예외) 클래스에는 IOException와 RuntimeException이 있다.

    • 이것이 컴파일 에러와 런타임 에러를 따로 클래스로 구분한 것이다.


  1. Exception 및 하위 클래스 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 컴파일시 발생하는 예외

    • 존재하지 않는 파일의 이름을 입력 (FileNotFoundException)

    • 실수로 클래스의 이름을 잘못 기재 (ClassNotFoundException)

    • 입력한 데이터 형식이 잘못된 경우 (DataFormatException)


  2. RuntimeException 클래스 : 프로그래머의 실수로 발생하는 예외

    • 배열의 범위를 벗어남 (IndexOutOfBoundsException)

    • 값이 null인 참조 변수의 멤버를 호출 (NullPointerException)

    • 클래스 간의 형 변환을 잘못함 (ClassCastException)

    • 정수를 0으로 나누는 산술 오류 (ArithmeticException)


Checked Exception / Unchecked Exception

위에서 예외(Exception)는 컴파일 에러와 런타임 에러로 구분된다고 하였다.
그런데 또 다시 예외의 종류로 Check Exception / Unchecked Exception으로 나뉜다.

쉽게 말하면, Check Exception은 컴파일 예외 클래스들을 의미하고 , Unchecked Exception은 런타임 예외 클래스들을 의미한다고 보면 된다.

이렇게 나눈 이유에 대해서는 코드적 관점에서 예외 처리 동작을 필수 지정 유무에 따라 나뉘기 때문이다.

(공백)Check ExceptionUnchecked Exception
처리여부반드시 예외처리를 해야한다명시적인 처리를 안해도 된다.
확인시점컴파일 단계런타임 단계
예외 종류RuntimeException을 제외한 Exception 클래스와 하위 예외 클래스RuntimeException과 그 하위 예외 클래스

참고

profile
백엔드 개발자가 되고 싶어요

0개의 댓글