Tech/Java

자바의 예외 처리

봄의 개발자 2024. 2. 26.
728x90
반응형

1. 자바에서 예외 처리 방법

자바에서 예외 처리란, 프로그램 실행 중 발생할 수 있는 예기치 못한 예외 발생에 대비한 코드를 작성하는 것이며, 예외 처리의 목적은 예외의 발생으로 인한 실행 중인 프로그램의 갑작스런 비정상 종료를 막고 실행 상태를 유지할 수 있도록 함

예외 처리(Exception Handling) 정의: 프로그램 실행 시 발생할 수 있는 예외 발생에 대비한 코드를 작성하는 것 목적: 프로그램의 비정상 종료를 막고, 정상적인 실행 상태를 유지하는 것

 

자바의 예외 처리는

  • 예외가 발생한 메소드 내에서 직접 처리하는 방법
  • 예외가 발생한 메소드를 호출한 곳으로 예외 객체를 넘겨주는 방법
  • 사용자 정의 예외를 생성해서 처리하는 방법

1. 예외가 발생한 메소드 내에서 직접 처리 (try - catch - finally)

try {
 	예외 발생 가능성이 있는 문장들; 
}catch(예외 타입1 매개변수명) {
	  예외타입1의 예외가 발생할 경우 처리 문장들; 
}catch(예외 타입2 매개변수명) {
	  예외타입2의 예외가 발생할 경우 처리 문장들; 
}finally {	    
		항상 수행할 필요가 있는 문장들;
}
  • try 블록은 예외가 발생할 가능성이 있는 범위를 지정하는 블록으로, 최소한 하나의 catch 블록이 있어야 함
  • catch 블록의 매개변수는 예외 객체가 발생했을 때 참조하는 변수명으로 반드시 java.lang.Throwable 클래스의 하위 클래스 타입으로 선언되어야 함
  • 지정된 타입의 예외 객체가 발생하면 try 블록의 나머지 문장들은 수행되지 않고, 자바 가상 머신은 발생한 예외 객체를 발생시키며 발생한 예외 객체 타입이 동일한 catch 블록을 수행함
  • finally 블록은 필수 블록은 아니지만 이 블록의 내용은 예외 발생 유무나 예외 catch 유무와 상관없이 무조건 수행됨

2. 예외가 발생한 메소드를 호출한 곳으로 예외 객체를 넘기는 방법 (throws)

  • try-catch-finally 블록을 이용하여 직접 처리하지 않아도 예외가 발생한 메소드를 호출한 지점으로 예외를 전달하여 처리하는 방법이 있음
  • 이때 사용하는 예약어가 throws
  • 어떠한 메소드의 내부 소스 코드에서 에러가 발생했을 때 이 메소드를 사용하는 곳으로 책임을 전가하는 행위
public class ExceptionTest {    

static void callDriver() throws ClassNotFoundException {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        System.out.println("완료");    
}    

public static void main(String[] args) {
         try {
            callDriver();
         }catch (ClassNotFoundException e) {
            System.out.println("클래스를 찾을 수 없습니다.");
         }catch (Exception e) {
            System.out.println(e.getMessage());
         }finally {            
						System.out.println("시스템 종료");
         }
    }
}
  • 결과
클래스를 찾을 수 없습니다.
시스템 종료
  • mail에서 callDriver() 메서드 실행
  • callDriver() 메서드에서 oracle.jdbc.driver.OracleDriver 클래스를 가져옴
  • 해당 클래스를 찾지 못하면 ClassNotFoundException 이 발생하는데 callDriver()에서는 throws ClassNotFoundException 처리로 호출한 main에 예외를 넘김
  • main에서는 ClassNotFoundException을 받아 catch문에서 잡아서 “클래스를 찾을 수 없습니다.” 메시지를 출력함
  • 마지막으로 finally가 실행되면 “시스템 종료”를 출력함

3. 사용자 정의 예외 생성 (throw)

  • 기존의 예외 클래스로 예외를 처리할 수 없다면 사용자가 직접 예외 클래스를 작성해서 발생시킬 수 있음
  • 사용자가 예외 클래스를 직접 정의하려면 예외 클래스의 최상위 클래스인 java.lang.Exception 클래스를 상속받아 클래스를 정의함
class {예외클래스이름} extends Exception {

// ex)
public class MyException extends Exception {
    public MyException() {
	      super("사용자 정의 예외");    
		}
}
  • 자바 가상 머신은 프로그램 수행 중에 예외가 발생하면 자동으로 해당하는 예외 객체를 발생시킨 다음 catch블록을 수행함
  • 하지만 예외는 사용자가 강제적으로 발생시킬 수 있음
  • 예외를 발생시키기 위해 throw 예약어 사용
throw new {예외클래스이름}(매개변수);
  • throw를 이용한 예외 발생 시에도 try-catch-finally 구문을 이용한 예외 처리를 하거나, throws를 이용해 예외가 발생한 메소드를 호출한 다른 메소드를 넘기는 예외 처리 방법을 사용해야 함

2. 자바가 제공하는 예외 계층 구조

  • 자바에서 Exception은 checked, unchecked 두 가지로 나눌 수 있음

체크 예외(Checked Exception)

  • 실행하기 전에 예측 가능한 예외들을 말하는데, 체크 예외가 발생할 수 있는 메소드를 사용할 경우 복구가 가능한 예외들이기 때문에 반드시 예외를 처리하는 코드를 작성해야 함
  • catch문으로 예외를 잡거나, throws로 자신이 호출한 클래스로 예외를 던지를 방법으로 해결해야 함
  • ex) IOException, SQLExceptiopn

언체크 예외(Unchecked Exception)

  • 실행하고 난 후에 알 수 있는 예외들을 말하는데, 언체크 예외라고 불리는 이유는 명시적으로 예외 처리를 강제하지 않기 때문임
  • 언체크 예외는 따로 catch문으로 예외를 잡거나, throws로 선언하지 않아도 됨
  • 프로그램에 오류가 있을 때 발생하도록 의도된 것임
  • ex) NullPointerException, ArrayIndexOutOfBoundException

3. Exception과 Error 차이는?

  • Error는 실행 중 일어날 수 있는 치명적 오류, 컴파일 시점에 체크할 수 없고 오류가 발생하면 프로그램은 비정상 종료됨
  • Exception은 Error보다 비교적 경미한 오류, try-catch를 이용해 프로그램의 비정상적인 종료를 박을 수 있음
  • Error는 런타임에서 실행 시 발생되면 전부 예측 불가능한 Unchecked Error에 속함
  • Exception과 다르게 에러가 발생할 경우 코드를 고치지 않고서는 해결이 불가능함

출처

728x90
반응형

댓글