2024. 4. 16. 18:27ㆍJava
- 프로그램 실행 중에 발생할 수 있는 예상치 못 한 상황(예외)에 대비하여 프로그램의 정상적인 흐름을 유지하고 예외 상황을 안전 하게 처리하는 프로그래밍 기법
- 에외처리가 없으면 프로그램이 비정상적으로 종료된다.
기본 구조
자바에서 예외 처리는 주로 try-catch-finally 블록을 사용하여 구현됩니다.
try 블록: 예외가 발생할 수 있는 코드를 포함합니다.
catch 블록: try 블록에서 발생한 예외를 처리합니다.
finally 블록 (선택적): 예외 발생 여부와 관계없이 실행되는 코드를 포함합니 다.
public class Main {
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
// 예외 처리 완료
RuntimeException
RuntimeException 은 자바의 예외 처리 체계에서 중요한 부분을 차지하는 클래스입니다. java.lang 패키지에 속하며, Exception 클래스의 서브클래스입니다. 이 예외 는 주로 자바 런타임 시스템에서 발생하는 예외를 나타냅니다.
사례)
- 배열의 인덱스를 잘못 접근하는 경우 ( ArrayIndexOutOfBoundsException )
- null 참조에 대한 연산 시도 ( NullPointerException )
- 잘못된 형 변환 시도 ( ClassCastException )
- 수학적으로 불가능한 연산 시도 ( ArithmeticException , 예: 0으로 나누기)
<잘못된 배열 인덱스 접근>
public class Main {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
try {
int number = numbers[3]; // ArrayIndexOutOfBoundsException 발생
} catch (RuntimeException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
}
CheckedException
CheckedException은 자바 프로그래밍에서 컴파일 시점에 체크되는 예외 유형입니 다. 이 예외들은 Exception 클래스의 서브클래스이지만, RuntimeException의 서브 클래스는 아닙니다. CheckedException은 주로 프로그램의 외부 요인에 의해 발생할 수 있는 예외 상황을 나타냅니다.
특징
- 컴파일 시점에서 체크: CheckedException은 컴파일러에 의해 체크되며, 이 예외를 처리하지 않으면 컴파일 오류가 발생합니다. 개발자는 이러한 예외를 처리하기 위해 try-catch 블록을 사용하거나, throws 키워드를 사용하여 예외를 호출한 메소드 로 전파해야 합니다.
- 예측 가능한 예외: 이러한 예외는 프로그램의 외부 요인, 예를 들어 파일 시스템 오 류, 네트워크 문제, 데이터베이스 연결 오류 등에 의해 발생하는 것이 일반적입니다
사례)
파일 입출력 작업 시 발생하는 (IOException)
데이터베이스 연결 시 발생하는 (SQLException)
존재하지 않는 파일에 접근할 때 발생하는 (FileNotFoundException)
<파일 읽기 작업 중 발생하는 IOException 처리>
import java.io.FileReader;
import java.io.IOException;
public class CheckedExceptionExample {
public static void main(String[] args) {
try {
FileReader fileReader = new FileReader("nonexistentfile.txt");
// 파일 읽기 로직
} catch (IOException e) {
System.out.println("파일 읽기 오류: " + e.getMessage());
}
}
}
사용자 정의 예외 클래스
자바는 개발자가 특정한 애플리케이션 요구에 맞게 사용자 정의 예외 클래스를 만 들 수 있도록 합니다. 이를 통해 더 명확하고 구체적인 예외 처리가 가능합니다.
public class CustomExceptionExample {
static void checkAge(int age) throws CustomException {
if (age < 18) {
throw new CustomException("나이가 너무 어립니다.");
}
}
public static void main(String[] args) {
try {
checkAge(15);
} catch (CustomException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
}
class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}
예외 떠넘기기
예외 떠넘기기는 발생한 예외를 호출한 메서드로 전달하는 것을 의미합니다. 이 방식은 예외를 처리하는 로직을 현재의 메서드 레벨에서 다루기 어려울 때, 또는 예외 처리를 상 위 레벨로 위임할 때 사용됩니다. 예외 떠넘기기를 통해 오류 처리의 책임을 명확하게 분 리하고, 코드의 가독성과 유지보수성을 높일 수 있습니다.
사용자 정의 예외와 함께 사용
<사용자 정의 예외 클래스>
class MyCustomException extends Exception {
public MyCustomException(String message) {
super(message);
}
}
<예외 발생시키는 메서드>
public class MyResource {
public void processResource(String value) throws MyCustomException {
if (value == null) {
throw new MyCustomException("Resource value cannot be null");
}
// 리소스 처리 로직
System.out.println("Processing resource with value: " + value);
}
}
<예외 떠넘기는 메소드>
public class ResourceHandler {
public void handleResource() {
MyResource resource = new MyResource();
try {
resource.processResource(null);
} catch (MyCustomException e) {
System.err.println("Error occurred: " + e.getMessage());
// 여기서 추가적인 예외 처리 로직을 수행할 수 있음
}
}
}
<실행 클래스>
public class Main {
public static void main(String[] args) {
ResourceHandler handler = new ResourceHandler();
handler.handleResource();
}
}
'Java' 카테고리의 다른 글
Java IO(입출력) (0) | 2024.04.22 |
---|---|
내부 클래스 (0) | 2024.04.16 |
인터페이스(Interface) (0) | 2024.04.16 |
추상 클래스 (0) | 2024.04.16 |
클래스 생성 및 인스턴스화 (0) | 2024.03.26 |