Java - 예외처리

제훈·2024년 7월 19일

Java

목록 보기
20/34

예외처리

예외처리

  • 오류 : 시스템 상에서 프로그램에 심각한 문제가 발생해 실행 중인 프로세스가 종료되는 것
    (개발자가 미리 예측하거나 코드로 처리하는 것이 불가능한 경우)

  • 예외 : 개발자가 미리 예측하고 처리할 수 있는 미약한 오류


사용 이유

  1. 미리 예측하고 컨트롤 할 수 있는 예외를 처리함으로써 프로그램이 예상치 못한 상황에 봉착하지 않도록 코드의 안정성과 신뢰성을 높여 이를 미연에 방지하거나 의도한 방향으로 컨트롤 할 수 있다.
  2. 개발 시에도 디버깅을 용이하게 해서 예외가 발생한 원인과 위치도 쉽게 파악할 수 있어 용이하다.

예외 클래스의 종류

(Error는 번외니까 신경 안 써도 된다.)

  • 오류와 예외는 모두 Throwable을 상속 받는다.
  • 예외의 최상위 클래스는 Exception 클래스이다.
  • Unchecked Exception 계열은 기본적 이미 처리되어 있고 실행 중인 프로그램이 종료되게 작성되어 있다.
  • Checked Exception 계열은 반드시 예외 처리를 해야 하고 하지 않으면 컴파일 에러가 발생한다.
  • RuntimeException타입의 예외들은 런타임 시점에 해당 예외 클래스 타입의 Exception이 발생한다.

예외처리 문법 활용

예외처리로 if 조건문에 대해 생각할 수도 있지만 if-else는 보통 코드의 흐름을 위해 쓴다고 생각하고 예외처리는 아래 2가지를 사용하자.

  1. throws를 통한 위임
  2. try-catch를 통한 처리

  1. throws를 통한 위임

    Exception이 발생하는 메소드(or 생성자)를 호출한 사우이 메소드에게 처리를 위임하는 방식

예제)
ExceptionTest

package com.ohgiraffers.section01.exception;

public class ExceptionTest {

    public void checkEnoughMoney (int price, int money) throws Exception {
        System.out.println("가지고 계신 돈은 " + money + "원입니다.");

        if (money >= price) {
            System.out.println(price + "원 상품을 구입하기 위한 금액이 충분합니다!");
            return;
        }

//        System.out.println("호주머니 상황이 ...");
        throw new Exception("호주머니 상황 이슈 ...");
    }
}
  1. try-catch

    발생한 Exception을 직접 처리하는 방식이다.

위 예제와 이어진 예제)
Application

public class Application {
    public static void main(String[] args) throws Exception {

        ExceptionTest exceptionTest = new ExceptionTest();

        try {
        	/* 개발자가 처리할 예외가 발생할 수 있는 적당한 범위를 try 블럭으로 감싼다. */
            exceptionTest.checkEnoughMoney(10000, 50000);
            exceptionTest.checkEnoughMoney(50000, 10000);
        } catch (Exception e) {
        	/* 개발자가 원하는 방식대로 try 블럭에서 발생한 예외 타입 객체를 활용해서 처리할 수 있다. */
            // try 블럭에서 예외가 발생하지 않으면 실행되지 않는 블럭이다.
            System.out.println("뭔가 예외 발생.");
            System.out.println("그 예외는 " + e.getMessage() + "!!");
            
            e.printStackTrace();
            System.exit(0); // 원하는 시점에 종료 가능
        }
    }
}
  • try 블럭
    예외(Exception)가 발생할 가능성이 있는 코드를 포함하여 작성하는 블럭

  • catch블럭
    try 블럭에서 예외 발생 시 해당 예외 타입(Exception 클래스 타입)에 대한 처리를 기술하는 블럭이다.
    여러 개의 catch블럭을 이어서 사용할 수 있으며 상위 타입의 예외를 처리하는 catch 블럭이 아래 쪽에 위치해야 한다.

  • finally 블럭
    예외 발생 여부와 상관 없이 꼭 실행되어 처리해야 할 코드가 있으면 작성하는 블럭이다. 주로 java.iojava.sql 패키지의 메소드 처리 시 자원 반납을 위해 사용한다.

finally 블럭을 만든 이유 : try 당시에 어떤 리소스를 쓰는데, 그 리소스가 예외가 발생했음에도 계속 동작하는 경우를 처리하기 위해서 만들었다.


RuntimeException 하위 클래스 종류

  1. ArithmeticException : 0으로 나누는 경우에 발생한다.
int dividend = 3;
System.out.println(dividend / 0);

  1. ArrayIndexOutOfBoundsException : 배열의 index 범위를 넘어서 참조하는 경우 발생
int[] intArr = new int[0];
System.out.println(intArr[1]);

  1. NullPointerException : 인스턴스가 참조되지 않은 상태(Null) 로 인스턴스에 접근하면 발생
int[] intArr = null;
System.out.println(intArr[0]);

4.ClassCastException : 형변환(Cast연산자 사용) 시 자료형에 문제가 있을 때 발생

Object obj = new String("hello");
int num = (Integer)obj;

  1. NegativeArraySizeException : 배열 크기를 음수로 지정한 경우 발생
int[] intArr = new int[-1];


오버라이딩 시 예외 발생 가능 범위


Child1, Child2 둘다 Parent와 상속관계에 있으며 오버라이딩하는 메소드는 부모 클래스의 원본 메소드보다 더 상위 타입의 예외를 발생시키면 안 된다.

profile
백엔드 개발자 꿈나무

0개의 댓글