Notice
Recent Posts
Recent Comments
Link
개발자는 기록이 답이다
🐙 Java에서 Exception과 Error의 차이점 본문
Exception과 Error의 차이점
Exception과 Error는 모두 자바에서 예외 처리 관련된 클래스들을 나타낸다. 그러나 두 개의 주요 차이점이 있다.
특성 | Exception(예외) | Error(에러) |
발생 원인 | 주로 프로그램 외부 요인으로 발생 | 주로 가상머신 같은 시스템 레벨에서 발생 메인보드 고장, 디스크 고장 등 |
처리 여부 | 개발자가 명시적으로 처리 가능 | 주로 프로그램이 직접 처리하지 않음 |
예시 | NullPointException, IOException |
OutOfMemoryError, StackOverflowError, NoClassDefFoundError |
처리 방법 | try-catch 블록을 사용하여 예외 처리 | 일반적으로 프로그램이 직접 처리하지 않음 |
예외 처리 가능 여부 | 일반적으로 예외 처리 가능 | 예외 처리 어려움 및 불가능 |
상속 관계 | Throwable 클래스를 상속받음 | Throwable 클래스를 상속받음 |
영향력 | 스레드에만 영향 | 프로세스에 영향 |
※ 예외 종류 참고 docs https://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html
Exception 예시
- NullPointException: null인 참조 변수를 사용하여 객체의 메서드나 속성을 호출할 때 발생한다. 즉, 객체가 초기화되지 않은 상태에서 해당 객체의 메서드나 속성을 사용하려고 할 때 발생한다.
public class NullPointerExceptionExample {
public static void main(String[] args) {
String str = null;
try {
System.out.println(str.length()); // null에 대한 메서드 호출
} catch (NullPointerException e) {
System.err.println("NullPointerException 발생: " + e.getMessage());
}
}
}
- IOException: 입출력 작업 중에 예외적인 상황이 발생할 때 발생한다. 파일을 읽거나 쓸 때 파일이 존재하지 않거나, 권한이 없는 등의 상황에서 IOException이 발생할 수 있다.
import java.io.FileInputStream;
import java.io.IOException;
public class IOExceptionExample {
public static void main(String[] args) {
try {
FileInputStream file = new FileInputStream("nonexistent_file.txt");
} catch (IOException e) {
System.err.println("IOException 발생: " + e.getMessage());
// 예외를 처리하는 추가적인 로직을 여기에 추가할 수 있습니다.
}
}
}
Error의 예시
- OutOfMemoryError: 힙 메모리가 모두 사용되어 더 이상 객체를 생성할 수 없을 때 발생한다. 주로 메모리 누수나 대용량 데이터 처리 등으로 인해 발생할 수 있다.
List<Object> list = new ArrayList<>();
while (true) {
list.add(new Object());
}
- StackOverflowError: 재귀 호출이 너무 깊게 이루어지거나 무한 루프로 인해 호출 스택이 가득 차서 발생한다.
public class RecursiveExample {
public static void recursiveMethod() {
recursiveMethod();
}
public static void main(String[] args) {
recursiveMethod();
}
}
- NoClassDefFoundError: 클래스를 찾을 수 없는 경우 발생. 클래스 패스에 해당 클래스가 없거나, 클래스 파일이 손상된 경우에 발생할 수 있다.
- LinkageError: 클래스 로딩 또는 링킹 단계에서 발생하는 오류로, 클래스 간의 의존성 문제 등으로 인해 발생할 수 있다.
- VirtualMachineError: 가상 머신 내부에서 발생하는 오류로서, 일반적으로 프로그램이 직접 처리할 수 없는 치명적인 오류이다.
Throwable 클래스는 어떤 역할을 할까?
Exception과 Error의 공통 부모 클래스는 당연히 Object클래스이다.
그리고, 공통 부모 클래스가 또 하나 있는데 java.lang패키지에 선언한 Throwable 클래스이다.
맨 위 상단의 그림을 보면 Throwable은 다시 두 하위 클래스로 나뉘는데, Exception과 Error이 있는것을 볼 수 있다.
따라서 자바에서 예외와 오류는 모두 Throwable 클래스를 상속받아 구현된다.
이 클래스는 예외와 오류를 모두 처리할 수 있는 catch 블록을 만들 수 있게 해주며, 예외와 오류의 공통적인 특징을 정의한다.
Throwable을 통해서 모든 예외를 처리할 수도 있지만, 예외 처리를 세분화해서 각 예외 타입에 맞게 처리하는게 권장된다.
public class ThrowableExample {
public static void main(String[] args) {
try {
// 예외 발생 예시: 배열의 길이를 초과하여 접근
int[] arr = new int[5];
System.out.println(arr[10]);
} catch (Throwable throwable) {
// Throwable 클래스를 이용한 예외 처리
System.err.println("예외 발생: " + throwable.getMessage());
}
}
}
'언어 > Java' 카테고리의 다른 글
🐙 Java의 어노테이션이란 무엇이고 어떻게 사용할까? (0) | 2023.12.22 |
---|---|
🐙 Checked Exception과 Unchecked Exception의 차이 (0) | 2023.12.22 |
🐙 Java의 enum은 뭘까? 어떤 상황에서 enum을 사용하면 좋을까? (0) | 2023.12.21 |
🐙 static 키워드를 잘못 사용했을 때 발생할 수 있는 문제와 올바른 사용법 (1) | 2023.12.21 |
🐙 Primitive 타입과 Reference 타입 (0) | 2023.12.21 |