자바의 예외 처리(Exception Handling)는 프로그램 실행 중에 발생할 수 있는 오류(에러)나 예외적인 상황을 처리하는 메커니즘입니다. 자바는 예외를 처리하기 위해 try-catch-finally 블록, throw와 throws 키워드, 그리고 사용자 정의 예외(Custom Exception) 등을 제공합니다. 자바의 예외 처리 시스템은 프로그램의 안정성과 유지보수성을 높여주는 중요한 기능입니다.
1. 예외란 무엇인가?
**예외(Exception)**는 프로그램 실행 중에 발생하는 비정상적인 상황을 의미합니다. 예외가 발생하면 프로그램의 정상적인 흐름이 중단될 수 있으며, 이를 적절히 처리하지 않으면 프로그램이 비정상 종료될 수 있습니다.
자바에서 예외는 Throwable 클래스를 상속받는 두 가지 주요 클래스로 구분됩니다:
• Exception: 프로그램에서 발생할 수 있는 예외적인 상황을 나타냅니다. 주로 개발자가 처리해야 하는 문제들입니다.
• Error: 시스템 레벨에서 발생하는 심각한 오류를 나타냅니다. 개발자가 직접 처리할 수 없는 문제들로, JVM에서 발생하는 문제가 대부분입니다. 예: OutOfMemoryError, StackOverflowError
2. 예외의 종류
자바의 예외는 크게 Checked 예외와 Unchecked 예외로 나뉩니다.
1. Checked 예외
• Checked 예외는 컴파일 시점에 반드시 처리해야 하는 예외입니다. 컴파일러가 이 예외를 처리하도록 강제하며, throws 키워드를 통해 예외가 발생할 수 있음을 선언하거나, try-catch 블록으로 반드시 예외를 처리해야 합니다.
• 예시: IOException, SQLException, ClassNotFoundException
Checked 예외 예시:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class CheckedExceptionExample {
public static void main(String[] args) {
try {
File file = new File("non_existent_file.txt");
FileReader fileReader = new FileReader(file); // FileNotFoundException 발생 가능
} catch (FileNotFoundException e) {
System.out.println("파일을 찾을 수 없습니다: " + e.getMessage());
}
}
}
2. Unchecked 예외
• Unchecked 예외는 런타임 시점에 발생하는 예외로, 컴파일러가 강제하지 않습니다. 주로 프로그래밍 실수나 논리적 오류로 인해 발생하며, 개발자가 예방해야 하는 예외입니다. RuntimeException 클래스를 상속받은 예외들이 여기에 해당합니다.
• 예시: NullPointerException, ArithmeticException, ArrayIndexOutOfBoundsException
Unchecked 예외 예시:
public class UncheckedExceptionExample {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
System.out.println(numbers[3]); // ArrayIndexOutOfBoundsException 발생
}
}
3. 자바에서 예외 처리하기
자바에서는 예외가 발생했을 때 이를 처리하기 위한 구조를 제공합니다. 이 구조는 프로그램이 비정상적으로 종료되지 않도록 하고, 예외 발생 시 적절한 대처를 할 수 있게 해줍니다.
1. try-catch 블록
• try 블록: 예외가 발생할 가능성이 있는 코드를 작성하는 곳입니다.
• catch 블록: try 블록에서 예외가 발생하면, 해당 예외를 처리하기 위한 코드를 작성하는 곳입니다.
try {
// 예외가 발생할 수 있는 코드
} catch (ExceptionType e) {
// 예외 처리 코드
}
2. finally 블록
• finally 블록은 예외 발생 여부와 상관없이 항상 실행되는 코드를 작성하는 곳입니다. 주로 자원 해제(파일 닫기, 데이터베이스 연결 종료 등)에 사용됩니다.
try {
// 예외가 발생할 수 있는 코드
} catch (ExceptionType e) {
// 예외 처리 코드
} finally {
// 예외 발생 여부와 상관없이 항상 실행되는 코드
}
3. throw와 throws 키워드
throw 키워드
• throw 키워드는 프로그래머가 직접 예외를 발생시키는 데 사용합니다. 주로 조건에 맞지 않는 상황에서 사용자 정의 예외나 기존 예외를 발생시킬 때 사용합니다.
public void checkAge(int age) {
if (age < 18) {
throw new IllegalArgumentException("나이가 너무 적습니다.");
}
}
throws 키워드
• throws 키워드는 메서드 선언부에서 이 메서드가 어떤 예외를 던질 수 있는지를 명시합니다. 이는 Checked 예외에서 주로 사용되며, 메서드를 호출하는 쪽에서 예외 처리를 강제합니다.
public void readFile(String fileName) throws FileNotFoundException {
File file = new File(fileName);
FileReader fileReader = new FileReader(file);
}
4. 예외 처리 예시
기본 예외 처리:
public class ExceptionExample {
public static void main(String[] args) {
try {
int result = 10 / 0; // ArithmeticException 발생
} catch (ArithmeticException e) {
System.out.println("예외 발생: " + e.getMessage());
} finally {
System.out.println("이 코드는 항상 실행됩니다.");
}
}
}
• 10 / 0에서 ArithmeticException이 발생하고, catch 블록에서 이 예외를 처리합니다. finally 블록은 예외 발생 여부와 관계없이 항상 실행됩니다.
5. 사용자 정의 예외(Custom Exception)
자바에서는 기본 제공되는 예외 외에도, 사용자 정의 예외를 만들 수 있습니다. 이 방법은 특정 비즈니스 로직에 맞는 예외를 정의하고 처리할 때 유용합니다.
사용자 정의 예외 작성:
class InvalidAgeException extends Exception {
public InvalidAgeException(String message) {
super(message);
}
}
public class CustomExceptionExample {
public static void main(String[] args) {
try {
checkAge(15);
} catch (InvalidAgeException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
public static void checkAge(int age) throws InvalidAgeException {
if (age < 18) {
throw new InvalidAgeException("나이가 너무 적습니다.");
}
}
}
• InvalidAgeException은 사용자 정의 예외로, 나이가 18세 미만일 때 발생합니다.
• checkAge 메서드는 예외를 던질 수 있다고 선언하고, 나이가 조건에 맞지 않으면 예외를 발생시킵니다.
6. 예외 처리의 중요성
예외 처리는 프로그램의 안정성과 예측 가능성을 높여줍니다. 적절한 예외 처리가 이루어지면 프로그램이 비정상 종료되는 것을 방지하고, 문제 발생 시 이를 처리하여 프로그램이 계속 동작할 수 있도록 합니다. 특히 다음과 같은 장점이 있습니다:
• 프로그램의 안정성: 예외 처리로 인해 프로그램이 예외 발생 시에도 안전하게 종료되거나 복구할 수 있습니다.
• 에러 추적 용이성: 예외 발생 시 로그와 메시지를 통해 문제를 쉽게 추적하고 디버깅할 수 있습니다.
• 비즈니스 로직 보장: 예외 상황에서도 비즈니스 로직의 일관성을 보장할 수 있습니다.
요약
• 자바에서 예외는 비정상적인 상황을 의미하며, 이를 처리하지 않으면 프로그램이 중단될 수 있습니다.
• 예외는 try-catch-finally 블록으로 처리하며, Checked 예외와 Unchecked 예외로 구분됩니다.
• throw와 throws 키워드를 사용하여 예외를 발생시키고 전달할 수 있으며, 사용자 정의 예외를 만들어 특정 비즈니스 로직에 맞는 예외 처리를 할 수 있습니다.
'Java' 카테고리의 다른 글
[JAVA] Static (0) | 2024.09.24 |
---|---|
[JAVA] 빌더(builder) (0) | 2024.09.24 |
[JAVA] 자바의 동작원리(JVM, JRE, JDK) (0) | 2024.09.24 |
[JAVA] 자바의 기본 구조 (1) | 2024.09.24 |
[JAVA] SOLID 원칙 (1) | 2024.09.22 |