예외처리(Exception)

2024. 4. 16. 18:27Java

- 프로그램 실행 중에 발생할 수 있는 예상치 못 한 상황(예외)에 대비하여 프로그램의 정상적인 흐름을 유지하고 예외 상황을 안전 하게 처리하는 프로그래밍 기법

- 에외처리가 없으면 프로그램이 비정상적으로 종료된다.

 

기본 구조

자바에서 예외 처리는 주로 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