예외 처리(Exception Handling)는 프로그램 실행 중 발생할 수 있는 예외적인 상황을 처리하여 프로그램의 비정상 종료를 막고 안정적으로 동작할 수 있도록 하는 중요한 메커니즘입니다. 자바의 예외 처리는 try, catch, finally, throw, throws 키워드를 사용하여 구현됩니다. 여기서는 예외의 종류, 예외 처리 방법, 사용자 정의 예외 등을 상세하게 보겠습니다.
1. 예외의 종류
자바의 예외는 크게 Checked Exception과 Unchecked Exception으로 나뉩니다.
Checked Exception
- 컴파일러가 예외 처리를 강제하는 예외입니다.
- 예외가 발생할 가능성이 있는 코드를 작성할 때 반드시 예외 처리를 해야 합니다.
- 예: IOException, SQLException, FileNotFoundException
Unchecked Exception
- 컴파일러가 예외 처리를 강제하지 않는 예외입니다.
- 주로 프로그래머의 실수로 인해 발생하며, 런타임에 발견됩니다.
- 예: NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException
2. 예외 처리 방법
try-catch 블록
try 블록 내에서 예외가 발생할 수 있는 코드를 작성하고, catch 블록에서 해당 예외를 처리합니다.
1
2
3
4
5
6
7
8
9
10
|
public class ExceptionHandlingExample {
public static void main(String[] args) {
try {
int result = 10 / 0; // ArithmeticException 발생
} catch (ArithmeticException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
}
|
cs |
finally 블록
finally 블록은 예외 발생 여부와 상관없이 항상 실행됩니다. 주로 자원 해제를 위해 사용됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
|
public class FinallyExample {
public static void main(String[] args) {
try {
int result = 10 / 0; // ArithmeticException 발생
} catch (ArithmeticException e) {
System.out.println("예외 발생: " + e.getMessage());
} finally {
System.out.println("이 코드는 항상 실행됩니다.");
}
}
}
|
cs |
throw 키워드
throw 키워드를 사용하여 명시적으로 예외를 발생시킬 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class ThrowExample {
public static void main(String[] args) {
try {
checkAge(15);
} catch (IllegalArgumentException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
public static void checkAge(int age) {
if (age < 18) {
throw new IllegalArgumentException("나이는 18 이상이어야 합니다.");
}
}
}
|
cs |
throws 키워드
throws 키워드를 사용하여 메서드가 어떤 예외를 던질 수 있는지 선언합니다. 해당 메서드를 호출하는 곳에서 예외 처리를 해야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ThrowsExample {
public static void main(String[] args) {
try {
readFile("nonexistentfile.txt");
} catch (FileNotFoundException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
public static void readFile(String fileName) throws FileNotFoundException {
File file = new File(fileName);
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
}
}
|
cs |
3. 사용자 정의 예외
사용자 정의 예외는 표준 예외 클래스(Exception 또는 RuntimeException)를 상속받아 정의할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class CustomExceptionExample {
public static void main(String[] args) {
try {
validateAge(15);
} catch (InvalidAgeException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
public static void validateAge(int age) throws InvalidAgeException {
if (age < 18) {
throw new InvalidAgeException("나이는 18 이상이어야 합니다.");
}
}
}
class InvalidAgeException extends Exception {
public InvalidAgeException(String message) {
super(message);
}
}
|
cs |
4. 예외 계층 구조
자바의 예외 계층 구조는 Throwable 클래스를 최상위로 하며, Exception과 Error 클래스로 나뉩니다.
- Throwable: 모든 예외와 오류의 최상위 클래스입니다.
- Exception: 애플리케이션에서 발생할 수 있는 예외를 나타내는 클래스입니다.
- Checked Exception: 컴파일러가 검사하는 예외입니다.
- Unchecked Exception: 런타임 예외로, 컴파일러가 검사하지 않습니다.
- RuntimeException: 프로그래머의 실수로 인해 발생하는 예외입니다.
- Error: 시스템 레벨에서 발생하는 심각한 오류입니다. 일반적으로 애플리케이션에서 처리하지 않습니다.
- 예: OutOfMemoryError, StackOverflowError
- Exception: 애플리케이션에서 발생할 수 있는 예외를 나타내는 클래스입니다.
5. 예외 처리 모범 사례
- 적절한 예외 처리: 모든 예외를 무조건 catch하지 말고, 필요한 경우에만 catch 블록을 사용합니다.
- 자원 해제: finally 블록 또는 try-with-resources 구문을 사용하여 자원을 해제합니다.
- 구체적인 예외 처리: 가능한 한 구체적인 예외를 catch하여 예외 상황을 명확히 합니다.
- 예외 정보 제공: 예외 메시지를 통해 유용한 정보를 제공하여 문제를 쉽게 디버깅할 수 있도록 합니다.
- 사용자 정의 예외: 도메인 특화된 예외를 만들어 비즈니스 로직을 명확히 합니다.
try-with-resources 구문
자바 7에서 도입된 try-with-resources 구문은 자원을 자동으로 해제하는 데 사용됩니다. AutoCloseable 인터페이스를 구현한 자원만 사용할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class TryWithResourcesExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
|
cs |
위와 같이 자바의 예외 처리는 다양한 방법으로 프로그램의 안정성을 높이고 예외 상황에 대처할 수 있도록 합니다. 올바른 예외 처리를 통해 코드의 가독성과 유지 보수성을 높일 수 있습니다.
'JAVA 공부' 카테고리의 다른 글
제네릭 (2) | 2024.07.05 |
---|---|
입출력 IO 와 NIO(New IO) (2) | 2024.07.05 |
기본 API (0) | 2024.07.05 |
가비지 컬렉터(Garbage Collector, GC) (0) | 2024.07.05 |
클래스 다이어그램 (0) | 2024.07.01 |