Java
JAVA Error & Exception
차가운개발
2024. 12. 2. 22:42
Error와 Exception은 문제가 발생했음을 나타내는 객체다
ㅇ Error
애플리케이션 실행 중에 복구할 수 없는 심각한 문제를 나타낸다.
- 개발자가 예외 처리(try-catch)로 복구할 수 없는 문제
- JVM이나 시스템의 문제가 원인인 경우가 많음
- ex 메모리 부족, 스택오버플로우
주요 하위 클래스
- OutOfMemoryError : 힙 메모리가 부족할 때 발생
- StackOverflowError : 재귀 호출이 너무 깊어져 스택 메모리가 초과될 때 발생
- NoClassDefFoundError : JVM이 필요한 클래스를 찾을 수 없을 때 발생
처리 방법 : 보통 에러는 애플리케이션 내에서 복구할 수 없으므로 예외 처리로 잡지 않고 프로그램을 중단하거나 로그를 남긴다.
public class ErrorExample {
public static void main(String[] args) {
try {
rescursiveMethod(); // 스택오버플로우 발생
} catch (StackOverflowError e) {
System.out.println("에러 발생: " + e.getMessage());
}
}
public static void recursiveMethod() {
recursiveMethod(); // 무한 재귀 호출
}
}
ㅇ Exception
프로그램 실행 중 발생할 수 있는 문제로 개발자가 처리할 수 있다
- 예외는 보통 애플리케이션의 논리적 오류나 입력값 문제로 인해 발생한다
- 개발자가 적절한 예외 처리를 비정상 종료를 방지하고, 안정적으로 실행되도록 하는 방법
- 문제 원인을 확인하고 사용자가 이해할 수 있는 메세지 제공
종류
- Checked Exception
컴파일러가 예외 처리를 강제
try-catch로 처리하거나 메서드 선언에 throws로 명시
ex : IOException, SQLException - Unchecked Exception
런타임에 발생하며, 컴파일러가 예외 처리를 강제하지 않음
보통 프로그래머의 실수로 발생
ex : NullPointerException, ArrayIndexOutOfBoundsException
처리방법 : try-catch 블록으로 처리하거나 throws 키워드로 호출자에게 예외를 넘김
public class TryCatchExample {
public static void main(String[] args) {
try {
int result = 10 / 0; // ArithmeticException 발생
} catch (ArithmeticException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
}
try {
// 예외 발생 가능 코드
} catch (예외타입 변수명) {
// 예외 처리 코드
}
try-catch-finally
finally 블록은 예외 발생 여부와 상관없이 항상 실행된
try {
// 예외 발생 가능 코드
} catch (예외_타입 변수명) {
// 예외 처리 코드
} finally {
// 항상 실행되는 코드
}
public class FinallyExample {
public static void main(String[] args) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("file.txt"));
System.out.println(reader.readLine());
} catch (IOException e) {
System.out.println("파일 읽기 중 예외 발생: " + e.getMessage());
} finally {
try {
if (reader != null) reader.close();
} catch (IOException e) {
System.out.println("자원 닫기 중 예외 발생");
}
}
}
}
throws
메서드가 예외를 처리하지 않고 호출한 쪽으로 예외를 위임한다
주로 Checked Exception을 메서드 선언부에 명시한다
public 반환타입 메서드명(매개변수) throws 예외_타입 {
// 예외 발생 가능 코드
}
public class ThrowsExample {
public static void main(String[] args) {
try {
readFile("nonexistent.txt");
} catch (IOException e) {
System.out.println("예외 처리: " + e.getMessage());
}
}
public static void readFile(String filename) throws IOException {// 예외 위임
BufferedReader reader = new BufferedReader(new FileReader(filename));
System.out.println(reader.readLine());
}
}
throw
명시적으로 예외를 발생시킬 때 사용한다
예외 객체를 생성하여 던진다
throw new 예외_타입("예외 메시지");
public class ThrowExample {
public static void main(String[] args) {
try {
validateAge(15);
} catch (IllegalArgumentException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
public static void validateAge(int age) {
if (age < 18) {
throw new IllegalArgumentException("나이는 18 이상이어야 합니다.");
}
}
}