성장일기

내가 보려고 정리하는 공부기록

언어/자바

[JAVA] 예외처리 (Exception) _ CheckedException, UnCheckedException

와나나나 2024. 6. 14. 14:19
728x90

코드를 작성하고 실행하다보면 수많은 에러가 발생한다. 나는 여지껏 '에러' 라고 뭉뚱그려 이야기했으나, 이들을 구분한다고 한다. 에러의 종류와 어떻게 처리해야 하는지에 대해 작성하려고 한다.

 

 ✅ 에러의 종류

에러에는 다음과 같은 종류가 있다.

  • 컴파일 에러
    • 소스코드 상의 문법에러로 소스코드를 수정해서 해결한다
  • 런타임 에러
    • 프로그램 실행중에 발생하는 에러로 사용자로부터 잘못된 값을 입력받거나 계산식의 오류 등으로 발생한다
  • 시스템 에러
    • 하드웨어의 오작동으로 발생하는 에러라서 코드를 수정해 해결이 불가능하다.

 

이들 중 컴파일에러와 런타임에러는 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 발생하는 프로그램 오류이므로 이를 예외(Exception)이라고 부른다.

 

예외에는 일반예외 (Checked Exception) 실행예외 (Unchecked Exception)이 있다.

 

 

Checked Exception

RuntimeException을 제외하고 Exception을 상속하고 있는 예외들이 Checked Exception에 포함된다. 예시로는 ClassNotFoundException, InterruptedException, IOException 등이 있다.

 

이 예외들은 반드시 예외처리를 해주어야 하며, 컴파일단계에서 예외처리가 되어있는지 확인한다. 예외처리가 되어있지 않으면 에러가 발생한다.

 

외부 매개체와 입출력이 일어날 때 주로 발생해 조건문이나 소스코드 수정으로 해결되지 않는다. 

 

예를 들어 readLine() 메소드를 사용할 때 IOException을 이용해 예외처리를 하지 않으면 에러가 발생한다.

 

 

Unchecked Exception

RuntimeException의 하위 클래스들을 의미한다. 예를 들면 배열 범위를 버성난 ArrayIndexOutOfBoundsException, 객체 값이 null인 상태로 해당 객체를 참조할 때 생기는 NullPointerException 등이 있다.

 

이 예외들은 checked Exception과 달리 명시적인 처리를 강제하지 않고, 실행단계에서 에러 발생 여부를 확인한다.

 

 

 

 ✅ 예외처리 방법

1. Try-catch-finally 문

try블록에는 예외가 발생할 가능성이 있는 코드를 넣는다. try블록에서 예외가 발생하면 catch 블록으로 가서 블록에 명시해둔 대로 예외처리 코드를 실행한다.

 

finally블록은 생략이 가능하고, 예외 발생 여부와 상관없이 실행할 내용을 이 블록에 넣는다.

 

 

2. throws

throws 키워드를 사용하면 메소드를 호출한 곳으로 예외를 떠넘길 수 있다. 

 

 

 

예외와 오버라이딩

부모 클래스의 메소드를 자식 클래스에서 오버라이딩 할 때, 자식 메소드의 예외처리는 부모의 메소드가 throws 하는 exception과 같거나 하위클래스여야 한다.