정의
프로그램 실행 중 예상치 못한 오류가 발생했을 때 , 프로그램의 비정상적인 종료를 막고 적절한 대응을 위한 방법
오류가 발생했을 때의 처리 로직을 명확하게 정의할 수 있으며, 이를 통해 사용자 경험을 개선하고 시스템의 안정성을 높임
기본 개념
예외(Exception) - 프로그램 실행 중 발생할 수 있는 오류나 비정상적인 상황
예외 처리(Exception Handling) - 예외가 발생했을 때 이를 적절히 처리하여 프로그램이 정상적으로 실행될 수 있도록 하는 방법
예외의 종류
- 예외는 일반적으로 Checked Exception과 Unchecked Exception으로 분류
Checked Exception
- 컴파일 타임에 검사되는 예외
- 컴파일 시에 반드시 처리되거나 선언되어야 함
- 개발자는 이러한 예외가 발생할 가능성이 있는 코드 무조건적 예외 처리를 해야함
- 주요 예시
- IOException : 파일 입출력 작업에 발생할 수 있는 예외
- SQLException : 데이터베이스 작업 중 발생할 수 있는 예외
- ClassNotFoundException : 클래스가 로드되지 않을 때 발생하는 예외
Unchecked Exception
- 런타임 시에만 검사되는 예외로, 컴파일 타임에는 확인되지 않음
- 주로 프로그래밍 오류에서 발생, 개발자가 명시적으로 처리하지 않아도 상관X
- RuntimeException을 상속받는 예외들이 해당
- 주요 예시
- NullPointException : 객체가 null인 상태에서 메서드를 호출하려고 할 때 발생
- ArrayIndexOutOfBoundsException : 배열의 잘못된 인덱스에 접근할 때 발생
- ArithmeticException : 0으로 나누기와 같은 수학적 오류가 발생할 때 발생
Error
- 예외외는 다르며, 주로 JVM에서 발생하는 심각한 오류를 의미
- 보통 애플리케이션에서 복구할 수 없는 상황을 나타냄
- 주요 예시
- OutOfMemoryError : JVM 메모리가 부족할 때 발생
- StackOverflowError : 재귀 호출이 너무 깊어져서 스택이 가득 찼을 때 발생
예외처리 메커니즘
예외 직접처리
- 발생항 예외를 메서드 내에서 try-catch 블록을 사용하여 처리하는 방식
- 예외가 발생한 시점에서 즉시 예외를 처리하여 프로그램 흐름을 제어
- try-catch
- try : 예외가 발생할 수 있는 코드를 감싼다. → try 블록 내에서 예외가 발생하면 catch 블록에서 처리
- catch : try블록 내에서 발생한 예외를 처리, 여러개의 catch블록을 사용하여 다양한 예외를 처리할 수 있음
- finally(선택) : 예외 발생 여부와 상관없이 항사 실행되어야하는 코드
- throw
- throw : 예외를 명시적으로 발생시킬 때 사용
- 장점
- 예외를 발생한 지점에서 즉시 처리하여 코드의 흐름을 간단하게 유지 가능
- 단점
- 중복된 예외 처리 코드가 여러 곳에 분산될 수 있음
- 예외를 적절하게 처리하지 않으면 코드의 가독성이 저하
- 예제
public void readFile(String fileName) {
try {
FileReader file = new FileReader(fileName);
BufferedReader fileInput = new BufferedReader(file);
for (int counter = 0; counter < 3; counter++)
System.out.println(fileInput.readLine());
fileInput.close();
} catch (IOException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
예외 던지기
- 예외 던지기는 메서드 내에서 예외를 직접 처리하지 않고, 호출한 메서드나 싱위 호출자에게 예외를 전달하는 방식
- 메서드 시그니쳐에 throws 키워드를 사용하여 예외를 선언, 필요한 경우 throw 키워드 사용
- 장점
- 예외 처리를 호출자에게 위임하여 코드의 책임을 분리
- 공통된 예외 처리를 중앙에서 관리 가능
- 단점
- 예외가 전파될 경우 예외 처리가 지연될 수 있음
- 호출자에게 예외 처리를 강제할 수 있음
- 예제
public void readFile(String fileName) throws IOException {
FileReader file = new FileReader(fileName);
BufferedReader fileInput = new BufferedReader(file);
for (int counter = 0; counter < 3; counter++)
System.out.println(fileInput.readLine());
fileInput.close();
}
public void processFile() {
try {
readFile("example.txt");
} catch (IOException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
public void readFile(String fileName) throws IOException {
FileReader file = new FileReader(fileName);
BufferedReader fileInput = new BufferedReader(file);
for (int counter = 0; counter < 3; counter++)
System.out.println(fileInput.readLine());
fileInput.close();
}
public void processFile() {
try {
readFile("example.txt");
} catch (IOException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
Share article