예외 처리
개념
- 예외 (Exception): 프로그램 실행 중에 발생하는 예기치 않은 상황을 의미.
- 예외 처리 (Exception Handling): 예외 발생 시 적절히 대처하는 방법을 의미.
예외 처리(Exception Handling) 는 프로그램 실행 중에 발생할 수 있는 예상치 못한 상황(예외)에 대비하여 프로그램의 정상적인 흐름을 유지하고 예외 상황을 안전하게 처리하는 프로그래밍 기법.(예외 처리를 하지않으면 프로그램이 중단, 종료되어 버림)
- 자바에서 예외 처리는 주로 try-catch-finally 블록을 사용하여 구현됨.
- try 블록: 예외가 발생할 수 있는 코드를 포함합니다.
- catch 블록: try 블록에서 발생한 예외를 처리합니다.
- finally 블록 (선택적): 예외 발생 여부와 관계없이 실행되는 코드를 포함합니다.
package day08;
public class ExceptionProcessing {
public static void main(String[] args) {
try {
int result = 10 / 0; // 예외 발생 가능 코드
} catch (ArithmeticException e) {
System.out.println("산술 예외 발생: " + e.getMessage());
} finally {
System.out.println("이 코드는 항상 실행됩니다.");
}
}
// 출력:
// 산술 예외 발생: / by zero
// 예외 처리 완료
}
try : 일단 이거 해봐(오류 가능성이 있는코드)
catch : 예외 캐치했어? 그럼 이거해
finally : 처리 여부 상관없이 무조건 이거 해.
throw: 예외를 발생시키는 키워드.
throws: 메서드가 처리하지 않고 호출자에게 예외를 전달할 때 사용하는 키워드.
다양한 종류의 예외 : 체크 예외(Checked Exception)와 언체크 예외(Unchecked Exception)
체크 예외 (Checked Exception)
체크 예외는 컴파일러가 예외 처리를 강제하는 예외입니다. 이러한 예외는 반드시 try-catch 블록으로 처리하거나 메서드 시그니처에 throws 키워드를 사용해 상위 메서드로 전달해야 합니다. 대표적인 체크 예외로는 다음과 같은 것들이 있습니다:
- IOException: 입출력 작업 중 발생하는 예외.
- SQLException: 데이터베이스 접근 중 발생하는 예외.
- ClassNotFoundException: 클래스 파일을 찾을 수 없을 때 발생하는 예외.
언체크 예외 (Unchecked Exception)
언체크 예외는 컴파일러가 예외 처리를 강제하지 않는 예외입니다. 이러한 예외는 프로그램 실행 중에 예기치 않게 발생할 수 있으며, 보통 RuntimeException을 상속받는 예외들입니다. 대표적인 언체크 예외로는 다음과 같은 것들이 있습니다:
- NullPointerException: null 참조를 접근할 때 발생하는 예외.
- ArrayIndexOutOfBoundsException: 배열 인덱스가 범위를 벗어날 때 발생하는 예외.
- ArithmeticException: 숫자 연산 중 발생하는 예외 (예: 0으로 나누기).
예외 계층 구조
java.lang.Throwable
|-- java.lang.Exception
| |-- java.io.IOException
| |-- java.sql.SQLException
| |-- java.lang.RuntimeException
| |-- java.lang.NullPointerException
| |-- java.lang.ArrayIndexOutOfBoundsException
|-- java.lang.Error
|-- java.lang.OutOfMemoryError
|-- java.lang.StackOverflowError
RuntimeException
RuntimeException은 Java의 예외 클래스 계층에서 unchecked exception으로 분류되는 예외를 나타냄. 이는 실행 시점에 발생할 수 있는 예외를 표현하며, 코드 컴파일 시점에 강제적으로 처리하지 않아도 되는 예외임.
1. RuntimeException의 특징
- Unchecked Exception:
- 컴파일러가 예외 처리를 강제하지 않음.
- try-catch 블록 또는 throws 키워드를 사용하지 않아도 컴파일 에러가 발생하지 않음.
- 실행 시점 예외:
- 런타임에 발생하며, 일반적으로 프로그래머의 실수로 인해 발생하는 경우가 많음.
- 예: 잘못된 로직, 유효하지 않은 데이터 접근 등.
- 상속 계층:
- java.lang.Throwable → java.lang.Exception → java.lang.RuntimeException.
- 대표적인 서브클래스:
- NullPointerException (널 참조 오류)
- ArrayIndexOutOfBoundsException (배열 인덱스 초과)
- ArithmeticException (산술 오류, 예: 0으로 나누기)
- ClassCastException (잘못된 타입 캐스팅)
2. RuntimeException 사용 예
(1) NullPointerException
String str = null;
System.out.println(str.length()); // NullPointerException 발생
(2) ArrayIndexOutOfBoundsException
int[] numbers = {1, 2, 3};
System.out.println(numbers[5]); // ArrayIndexOutOfBoundsException 발생
(3) ArithmeticException
int result = 10 / 0; // ArithmeticException 발생
(4) ClassCastException
Object obj = "Hello";
Integer number = (Integer) obj; // ClassCastException 발생
3. RuntimeException 처리 방법
- 런타임 예외는 필수적으로 처리하지 않아도 되지만, 안정적인 프로그램을 위해 적절한 예외 처리가 권장됨.
- 예외 처리 방식:
- try-catch 블록을 사용해 예외를 잡음.
- 예외 발생을 방지하는 로직 추가.
예제: try-catch로 처리
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
}
예제: 방어적 코드로 예방
String str = null;
if (str != null) {
System.out.println(str.length());
} else {
System.out.println("String이 null입니다.");
}
4. RuntimeException을 사용하는 이유
- 런타임 예외는 프로그램의 비정상적인 상태를 표현하는 데 유용.
- 개발자가 직접 처리해야 할 예외와 그렇지 않아도 되는 예외를 구분하는 데 도움을 줌.
- 코드 가독성을 높이고, 일반적인 오류 상황에 대비할 수 있도록 설계됨.
5. RuntimeException과 Checked Exception의 차이
특징 | RuntimeException | Checked Exception |
처리 요구 | 처리하지 않아도 컴파일됨 | 반드시 처리해야 함 |
발생 시점 | 실행 시점 | 컴파일 또는 실행 시점 |
예시 | NullPointerException 등 | IOException, SQLException 등 |
주된 원인 | 프로그래밍 실수 또는 로직 문제 | 외부 환경 요인 (파일, 네트워크) |
결론
RuntimeException은 실행 중 발생할 수 있는 프로그래밍 오류를 나타내며, 개발자가 적절한 방어적 프로그래밍 또는 예외 처리를 통해 문제를 방지하거나 해결해야 함. 이를 올바르게 이해하고 활용하면 코드의 안정성을 높이고, 예외 상황에 대비할 수 있음.
'멋쟁이사자처럼_부트캠프 > Java' 카테고리의 다른 글
[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 16일차 컬렉션 프레임워크, Iterator (0) | 2024.12.23 |
---|---|
[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 10일차 내부 클래스, 익명 개체, 자주 사용되는 클래스, 제네릭 (2) | 2024.12.13 |
[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 8일차 추상클래스, 인터페이스, Final (0) | 2024.12.11 |
[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 7일차 헷갈릴수 있는 코드 정리, 클래스 내부 필드와 문자열 처리 방식의 차이점, String (0) | 2024.12.11 |
[상속]필드와 메서드의 차이 (0) | 2024.12.09 |