CS/Java

Error & Exception

leah-only 2025. 4. 4. 17:25

Throwable class

예외와 관련된 최상위 클래스이다. 

대부분 이 클래스를 직접 사용하기보다 이를 상속받은 Error나 Exception이 주로 사용된다. 

Throwable 클래스는 객체에 대한 오류나 예외에 대한 메시지를 담거나 예외 정보들을 기록한다. 

  • getMessage() : 발생한 예외에 대한 구체적인 메시지를 반환
  • printStackTrace() : 예외에 대한 자세한 디버깅을 위해 주로 사용되는 메서드

 

오류(error)와 예외(exception)

  • error : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
  • exception : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류 

Error는 메모리 부족(Out of Memory Error)이나 스택오버플로우(StackOverflowError)와 같이 일단 발생하면 복구할 수 없는 심각한 오류이고 예측 불가능한 것이다. 즉, JVM 실행에 문제가 생긴 것으로 개발자가 대처할 방법이 없다. 

 

Exception은 수습될 수 있는 오류이다. 즉 알고리즘 오류도 예외가 발생한다고 해도 에러처럼 프로그램이 죽거나 그럴 경우가 적다. 예외는 대부분 개발자가 구현한 로직에서 발생하는 실수나 사용자의 영향에 의해 발생한다. 그러나 예외는 에러와 달리 이에 대한 예외처리 코드를 미리 작성해 놓음으로써 어느정도 프로그램의 비정상적인 종료 or 동작을 막을 수 있다. 


🔴 Error

프로그래밍에서는 오류를 발생 시점에 따라 크게 3가지로 나눈다. 

 

1. 컴파일 에러 : 컴파일시 발생하는 에러 (ex. 문법 구문 오류 / 맞춤법 or ; 등)

2. 런타임 에러 : 실행시 발생하는 에러 (ex. 개발 시 설계 비숙으로 발생하는 에러 대부분)

3. 논리적 에러 : 실행은 되지만 의도와 다르게 동작하는 것 (ex. 버그)

 

Out of Memory Error

  • 런타임 에러에 속한다. 
  • JVM이 더이상 메모리를 할당할 수 없을 때 (Heap 영역 부족 등)
  • ex. 너무 많은 객체를 생성하거나 캐시를 무한히 쌓을 때
  • 방지/해결 방법 : 메모리 누수 점검 및 heap 크기 크게 조정 

Stack Overflow Error

  • 런타임 에러에 속한다. 
  • 메서드 호출의 깊이가 깊어지거나 재귀가 종료되지 않고 지속되어 스택 메모리 한계를 초과할 때 발생
  • 방지/해결 방법 : 반복문으로 변경

⚠️ Exception

JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성하고 예외 처리 코드에서 예외 객체를 이용할 수 있도록 한다. 이 때 getMessage(), printStackTrace()를 써서 오류를 출력한다.

 

 

Exception 클래스는 RuntimeException(런타임 에러를 다룸)그 외의 자식 클래스 그룹(컴파일 에러를 다룸)으로 나뉜다. 

RuntimeException class

프로그래머의 실수로 발생하는 예외

  • 배열의 범위를 벗어남 (IndexOutOfBoundsException)
  • 값이 null인 참조 변수의 멤버를 호출 (NullPointerException)
  • 클래스 간의 형 변환을 잘못함 (ClassCastException)
  • 정수를 0으로 나누는 산술 오류 (ArithmeticException)
  • 배열의 범위를 넘어선 인덱스 참조시 오류 (ArrayIndexOutOfBoundsException)
  • 정수가 아닌 문자열을 정수로 변환할 때 발생 (NumberFormatException)

Exception 및 하위 클래스 (컴파일 예외 클래스)

사용자의 실수와 같은 외적인 요인에 의해 발생하는 컴파일시 발생하는 예외

  • 존재하지 않는 파일의 이름을 입력 (FileNotFoundException)
  • 실수로 클래스의 이름을 잘못 기재 (ClassNotFoundException)
  • 입력한 데이터 형식이 잘못된 경우 (DataFormatException)
  • 입출력 관한 컴파일 에러 (IOException)

Checked Exception / Unchecked Exception

Checked Exception은 컴파일 예외클래스들이고 UncheckedException은 런타임 클래스들을 말한다. 

재분류하는 이유는 코드적 관점에서 예외 처리 동작을 필수 지정 유무에 따라 나뉘기 때문이다.

즉, Checked Exception과 Unchecked Exception의 가장 핵심적인 차이는 '반드시 예외 처리를 해야 하는가?' 이다.

 

  Checked Exception Unchecked Exception
처리 여부 반드시 예외를 처리해야 함 명시적인 처리를 안해도 됨
확인 시점 컴파일 단계 런타임 단계
예외 종류 RuntimeException을 제외한 Exception 클래스와 그를 상속받는 하위 예외 클래스 RuntimeException과 그 하위 

 

Checked Exception

확인 시점이 컴파일 단계이기 때문에 별도의 예외 처리를 하지 않는다면 컴파일 자체가 되지 않는다.

따라서 반드시 로직을 try-catch로 감싸거나 throws로 던져서 예외를 처리해야 한다. 

 

Unchecked Exception

명시적인 예외 처리를 하지 않아도 된다.

개발자의 충분한 주의로 미리 회피할 수 있는 경우가 대부분이라 상대적으로 미약한 예외로 처리되어 자바 컴파일러는 별도의 예외 처리를 하지 않도록 설계되어 있기 때문이다.

에러를 일으키는 코드가 있어도 try-catch 처리하지 않더라도 컴파일 되고 실행까지 가능하다.


참고 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%97%90%EB%9F%ACError-%EC%99%80-%EC%98%88%EC%99%B8-%ED%81%B4%EB%9E%98%EC%8A%A4Exception-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC

, https://github.com/devSquad-study/2023-CS-Study/blob/main/java/java_error_vs_exception.md

'CS > Java' 카테고리의 다른 글

Java 8 특징  (0) 2025.04.07
자바의 비동기 처리  (0) 2025.04.07
Boxing & UnBoxing  (0) 2025.03.28
Mutable & Immutable  (0) 2025.03.26
Call by Value & Call by Reference  (0) 2025.03.24