1. 예외(Exception)란 무엇인가?
Java 프로그램을 실행하다 보면 예상치 못한 문제가 발생할 수 있습니다. 이런 문제를 예외(Exception)라고 부릅니다. 예외는 정상적인 프로그램의 흐름을 방해하며, 이를 적절히 처리하지 않으면 프로그램이 갑자기 종료될 수 있습니다.
Java에서는 예외를 객체로 표현하며, 이는 Throwable
클래스를 상속받는 두 가지 주요 하위 클래스인 Error
와 Exception
으로 나뉩니다:
- Error: JVM에서 발생하는 심각한 문제(예: OutOfMemoryError).
- Exception: 개발자가 처리 가능한 문제(예: 파일을 찾을 수 없는 경우).
2. Java 예외 처리의 기본: try-catch
Java는 예외가 발생했을 때 프로그램이 갑자기 종료되지 않고, 이를 처리할 수 있는 메커니즘을 제공합니다. 이 메커니즘의 핵심이 바로 try-catch
블록입니다.
try-catch
는 예외가 발생할 수 있는 코드를 보호하고, 문제가 발생했을 때 이를 처리하는 방법을 정의합니다.
3. try-catch
블록의 기본 구조
try-catch
블록은 다음과 같은 구조를 가지고 있습니다:
try {
// 예외가 발생할 가능성이 있는 코드
} catch (ExceptionType e) {
// 예외가 발생했을 때 실행되는 코드
}
간단한 예제
public class TryCatchExample {
public static void main(String[] args) {
try {
int result = 10 / 0; // 0으로 나누기 시도 (예외 발생)
} catch (ArithmeticException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
}
출력:
예외 발생: / by zero
주요 구성 요소
try
블록:
예외가 발생할 가능성이 있는 코드를 포함합니다.catch
블록:
특정 예외가 발생했을 때 이를 처리하는 코드를 작성합니다.- 예외 객체:
예외 발생 시,catch
블록에서 예외 객체를 통해 상세한 정보를 확인할 수 있습니다(예: 메시지, 스택 트레이스).
4. try-catch
에서 finally
의 역할
finally
블록은 예외 발생 여부와 관계없이 항상 실행되는 코드 블록입니다. 주로 파일, 네트워크, 데이터베이스 연결 등을 해제하는 데 사용됩니다.
구조
try {
// 예외가 발생할 가능성이 있는 코드
} catch (ExceptionType e) {
// 예외 처리 코드
} finally {
// 항상 실행되는 코드
}
예제
public class FinallyExample {
public static void main(String[] args) {
try {
int[] numbers = {1, 2, 3};
System.out.println(numbers[5]); // 예외 발생
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("예외 처리: " + e.getMessage());
} finally {
System.out.println("리소스를 정리합니다.");
}
}
}
출력:
예외 처리: Index 5 out of bounds for length 3
리소스를 정리합니다.
5. try-catch
와 함께 사용하는 다중 예외 처리
Java에서는 catch
블록을 여러 개 작성하여 다양한 예외를 처리할 수 있습니다.
예제
public class MultipleCatchExample {
public static void main(String[] args) {
try {
int[] numbers = {1, 2, 3};
System.out.println(numbers[5]); // ArrayIndexOutOfBoundsException 발생
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("배열 인덱스 오류: " + e.getMessage());
} catch (ArithmeticException e) {
System.out.println("산술 오류: " + e.getMessage());
}
}
}
6. 예외 처리와 리소스 관리: try-with-resources
Java 7부터 추가된 try-with-resources
는 리소스 관리가 필요한 코드를 작성할 때 매우 유용합니다. 이는 AutoCloseable
인터페이스를 구현한 객체를 자동으로 닫아줍니다.
예제
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class TryWithResourcesExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
System.out.println(br.readLine());
} catch (IOException e) {
System.out.println("파일 읽기 중 오류 발생: " + e.getMessage());
}
}
}
7. 사용자 정의 예외 처리
Java에서는 개발자가 직접 예외 클래스를 정의하여 특정 상황에 대한 예외를 처리할 수 있습니다.
사용자 정의 예외 클래스
class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}
사용자 정의 예외 사용 예제
public class CustomExceptionExample {
public static void main(String[] args) {
try {
throw new CustomException("사용자 정의 예외 발생!");
} catch (CustomException e) {
System.out.println(e.getMessage());
}
}
}
출력:
사용자 정의 예외 발생!
8. 예외 처리에서의 모범 사례
- 구체적인 예외를 처리하라
모든 예외를Exception
으로 처리하지 말고, 특정 예외를 처리하는 것이 좋습니다. - 필요한 경우에만
catch
사용
예외를 처리하지 않고 로그만 남긴다면, 굳이catch
블록을 남발하지 않는 것이 좋습니다. finally
블록을 사용하여 리소스 정리
리소스가 제대로 해제되지 않으면 메모리 누수가 발생할 수 있습니다.- 예외 메시지를 명확하게 작성하라
사용자에게 유용한 정보를 제공하는 메시지를 남기세요.
9. 결론
Java의 try-catch
는 예외 처리의 핵심 메커니즘으로, 프로그램의 안정성과 신뢰성을 높이는 데 필수적인 도구입니다. try
, catch
, finally
의 조합과 다양한 활용 방법을 이해하고 적재적소에 적용하면, 예외 상황에서도 견고한 애플리케이션을 개발할 수 있습니다.
예외 처리의 기본부터 고급 활용법까지 익혀, 오류 없는 안정적인 코드를 작성해보세요!
'개발 > JAVA' 카테고리의 다른 글
Java의 `extends`와 `implements` 이해하기: 상속과 인터페이스 완벽 가이드 (1) | 2025.01.25 |
---|---|
Java 로그 설정과 사용법 완벽 가이드: 안정적인 로깅 시스템 구축하기 (0) | 2025.01.25 |
Java에서 여러 타입의 파라미터 받기 (0) | 2025.01.16 |
Java에서 Object의 특정타입인지 확인하기 (0) | 2025.01.16 |
Java로 파일들을 압축하여 다운로드 받을 수 있는 예제 (0) | 2025.01.14 |