Java의 예외 처리
예외는 프로그램 실행 중에 발생하는 비정상적인 상황을 말한다. 예를 들어, 배열의 범위를 벗어난 인덱스에 접근하거나 파일이 존재하지 않는 경우에 파일을 열려고 시도하면 예외가 발생할 수 있다. 자바에서는 이러한 예외를 처리하지 않으면 프로그램이 비정상 종료되기 때문에예외 처리 기법이 매우 중요하다.
자바에서 예외 처리는 보통 Try → Throw → Catch의 흐름으로 진행된다. 프로그램 코드에서 예외가 발생할 가능성이 있는 부분을 try 블록에 넣고 실제로 예외가 발생하면 throw 키워드를 통해 예외를 던진다. 던져진 예외는 catch 블록에서 처리하게 된다.
아래와 구조로 예외 처리가 이루어지며 여기서 중요한 것은 try 블록에서 문제가 생기면 프로그램이 바로 종료되지 않고 catch 블록으로 넘어가서 처리된다는 점이다.
try {
// 예외가 발생할 수 있는 코드
} catch (ExceptionType e) {
// 예외 처리 코드
} finally {
// 항상 실행되는 코드 (선택 사항)
}
컴파일 에러와 런타임 에러 (Checked Exception vs Unchecked Exception)
자바의 예외는 크게 Checked Exception과 Unchecked Exception으로 나눌 수 있다.
Checked Exception
Checked Exception은 컴파일 시점에서 발생할 수 있는 예외로 반드시 예외 처리를 해야 컴파일이 된다. 예를 들어, 파일을 읽을 때 파일이 존재하지 않을 경우 발생하는 IOException은 대표적인 Checked Exception이다. 자바 컴파일러는 이런 예외를 처리하지 않으면 컴파일 자체를 허용하지 않기 때문에 반드시 예외 처리를 해줘야 한다.
public void readFile(String fileName) throws IOException {
FileReader file = new FileReader(fileName); // 파일이 없으면 IOException 발생
BufferedReader fileInput = new BufferedReader(file);
}
Unchecked Exception
Unchecked Exception은 런타임 시점에서 발생하는 예외이다. 이러한 예외는 컴파일 시점에서는 처리할 필요가 없지만 프로그램 실행 중에 발생할 수 있다. 대표적인 예로 NullPointerException이나 ArrayIndexOutOfBoundsException이 있다. 개발자는 이러한 예외 상황을 예측하기 어려운 경우가 많으므로 런타임에서 예외가 발생하면 적절한 로그와 함께 문제를 추적해야 한다.
private static void uncheckedExceptionWithTryCatch(String str) {
try {
str = str.toUpperCase(); // str이 null일 경우 NullPointerException 발생
System.out.println(str);
} catch (NullPointerException e) {
e.printStackTrace(); // 예외 발생 시 스택 트레이스를 출력
}
}
자바에서의 예외 처리 전략
자바에서 예외 처리를 잘하는 것은 중요한 능력 중 하나이다. 단순히 예외를 잡아내는 것에 그치지 않고 적절하게 로그를 남긴 후 예외 발생 원인을 파악할 수 있도록 해야 한다. 특히 Unchecked Exception은 발생 원인이 매우 다양하기 때문에 예외 발생 시 로그와 Stacktrace를 남겨야 문제를 디버깅할 수 있다.
운영 환경에서는 StackTrace만으로는 충분하지 않을 수 있다. 운영 중 발생한 예외는 기록이 남지 않기 때문에 더 효과적인 예외 처리 전략으로는 로그를 남기는 것이 좋다.
로그를 남기려면 로깅 프레임워크(예: Log4j, SLF4J)를 사용하여 예외 메시지와 함께 스택 트레이스를 저장하는 것이 좋다.
try {
// 예외 발생 가능 코드
} catch (NullPointerException e) {
logger.error("NullPointerException 발생", e); // 로그에 예외 기록
}
커스텀 예외(Custom Exception)
자바에서는 기본 제공되는 예외 클래스 외에도 상황에 맞게 커스텀 예외를 정의할 수 있다. 커스텀 예외를 사용하면 코드에서 발생할 수 있는 특정 오류에 대한 명확한 처리를 할 수 있어 프로그램의 유지보수성을 높일 수 있다.
아래 예제처럼 특정 조건에서 발생할 수 있는 예외를 커스텀 예외로 처리하면 코드의 가독성도 높아지고 예외 발생 상황에 대해 더 명확하게 알 수 있다.
public class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}
public void validateAge(int age) throws CustomException {
if (age < 18) {
throw new CustomException("나이가 18세 이상이어야 합니다.");
}
}
참고문헌
'Backend > Java' 카테고리의 다른 글
[Java] DTO와 VO의 차이점 (0) | 2024.10.15 |
---|---|
[Java] 객체 생성 방법 (0) | 2024.10.15 |
[Java] 자바 캡슐화의 이해 (Encapsulation) (2) | 2024.10.09 |
[Java] JVM : Java Virtual Machine (0) | 2024.10.08 |
[Java] JDK와 JRE의 개념과 차이점 (2) | 2024.09.30 |