개발 일지/Java

[Java] 예외 처리(Exception Handling)

미숫가루설탕많이 2023. 1. 4. 14:12

 예외 처리(exception handling)란, 개발자가 예기치 못한 예외의 발생에 미리 대처하는 코드를 작성하는 것이다. 실행 중인 프로그램의 비정상적인 종료를 방지하고 정상적인 실행 상태를 유지하는 것이 목적이다.

 

 자바에서는 예외가 발생하면 예외 클래스로부터 객체를 생성하여 해당 인스턴스를 통해 예외처리를 한다.

 

 자바의 모든 에러와 예외 클래스는 Throwable 클래스로부터 확장되며, 모든 예외의 최고 상위 클래스는 Exception 클래스이다.

 

<출처> 코드스테이츠

 

 

 

 

일반 예외 클래스(Exception)

 

런타임 시에 발생하는 RuntimeException 클래스와 그 하위 클래스를 제외한 모든 Exception 클래스와 그 하위 클래스를 가리킨다.

 

 주로 외부의 영향으로 발생할 수 있는 것들로 I/O 입출력에 의해 발생하는 경우가 많다.

ex) 잘못된 클래스명(ClassNotFoundException)이나 데이터 형식(DataFormatException) 등

 

 

 

 

실행 예외 클래스(Runtime Exception)

 

 RuntimeException 클래스와 그 하위 클래스를 가리킨다.

 

 주로 개발자의 실수에 의해 발생하는 경우가 많고 자바 문법 요소와 관련이 있다.

ex) 클래스 간 형변환 오류(ClassCastException), 벗어난 배열 범위 지정(ArrayIndexOutOfBoundsException), 값이 null인 참조변수 사용(NullPointerException) 등

 

 

 

 

try - catch문


  소스코드를 견고하게 작성한다면 예외가 줄어들 수는 있지만, 개발자가 아닌 사용자의 원인으로 발생하는 예외는 개발자가 미리 대처를 해줄 수 있다. 이런 예외가 발생했을 경우 처리하는 방법으로 try - catch문이 있다.

 

try {
    // 예외가 발생할 가능성이 있는 코드를 삽입
} 
catch (ExceptionType1 e1) {
    // ExceptionType1 유형의 예외 발생 시 실행할 코드
} 
catch (ExceptionType2 e2) {
    // ExceptionType2 유형의 예외 발생 시 실행할 코드
} 
finally {
    // 생략 가능
    // 예외 발생 여부와 상관없이 항상 실행
}

 

 만약 작성한 코드가 예외 없이 정상적으로 실행된다면 아래 catch 블럭은 실행되지 않고 finally 블럭이 실행된다. finally 블럭은 생략이 가능하지만 만약 작성한 경우에는 예외 발생 여부와 관계없이 항상 실행된다.

 

 각기 다른 종류의 예외를 여러 개의 catch 블럭으로 만들 수 있지만, 일치되는 하나의 catch 블럭만 실행되고 예외처리 코드가 종료되거나 finally 블럭으로 넘어간다.

 

 여기서 유의할 점은 예외가 발생하면 catch 블럭은 위에서부터 순차적으로 검사하기 때문에 구체적인 예외 클래스인 하위 클래스를 위에 배치하여 상위 예외 클래스가 먼저 실행되지 않도록 하는 것이 좋다.

 

 

 

 

예외 전가


 예외가 발생했을 경우 try - catch문 말고 예외를 호출한 곳으로 다시 예외를 떠넘기는 방법도 있다.

 

 예외 전가를 하려면 메서드의 선언부 끝에 throws 키워드와 발생할 수 있는 예외들을 쉼표로 구분해서 나열하면 된다.

반환타입 메서드명(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {
	...생략...
}

 

 예를 들어, 특정 메서드에서는 모든 종류의 예외가 발생할 가능성이 있다면 다음과 같이 코드를 작성할 수 있다. Exception 클래스는 모든 예외 클래스의 상위 클래스이기 때문에 그 하위 클래스 타입의 예외 클래스들이 모두 포함된다.

void ExampleMethod() throws Exception {
}

 

 

 throws 키워드와 유사한 throw 키워드를 사용하면 의도적으로 예외를 발생시킬 수도 있다.

try {
    Exception intendedException = new Exception();
    throw intendedException;
}
catch (Exception e) {
    System.out.println("예외 의도적으로 발생시키기");
}

 

'개발 일지 > Java' 카테고리의 다른 글

[Java] List<E>  (0) 2023.01.04
[Java] 컬렉션 프레임워크(Collection Framework)  (0) 2023.01.04
[Java] 에러(Error)  (0) 2023.01.04
[Java] 제네릭(Generic)  (0) 2023.01.04
[Java] 열거형(enumerated type, enum)  (0) 2023.01.04