예외처리(Exception)

제민·2024년 7월 24일

Java 개념 공부

목록 보기
17/21
post-thumbnail

예외처리(Exception)란?

예외(Exception)는 프로그램 실행 중 발생할 수 있는 다양한 오류를 의미하며, 이를 적절히 처리하지 않으면 프로그램이 비정상적으로 종료될 수 있습니다. 예외 처리는 이러한 상황을 예방하고, 프로그램이 안정적으로 동작할 수 있도록 하는 중요한 기법입니다.

에러의 종류

에러는 크게 네 가지 종류로 구분할 수 있습니다:

  1. 시스템 에러: 컴퓨터의 오작동으로 발생하는 에러로, 소스코드로 해결할 수 없습니다. 매우 심각한 에러입니다.
  2. 컴파일 에러: 소스코드 문법상의 오류로, 개발자의 실수로 발생합니다. 이 에러는 컴파일 시점에 발견되며 수정하기 쉽습니다.
  3. 런타임 에러: 코드 상으로는 문제가 없지만 프로그램 실행 도중 발생하는 에러로, 사용자의 실수 또는 개발자가 미처 처리하지 않은 기능으로 인해 발생합니다.
  4. 논리 에러: 문법적으로도 문제없고 실행했을 때도 문제는 없지만 프로그램의 의도와 맞지 않는 동작이나 결과가 나타나는 에러입니다. 수정하기 어렵습니다.

이 중, 개발자가 예측 가능하며 수정할 수 있는 에러들을 예외(Exception)라고 합니다.

예외 처리의 목적

예외 처리를 하지 않고 그대로 예외가 발생할 경우, 프로그램이 비정상적으로 종료될 수 있습니다. 예외 처리는 이러한 상황을 방지하고 프로그램이 안정적으로 동작할 수 있도록 합니다.

예외 처리 방법

1. try ~ catch 문을 이용

try 블록 내에서 예외가 발생할 수 있는 코드를 작성하고, catch 블록에서 해당 예외를 처리합니다.

2. throw를 이용 (떠넘기기)

메소드 내에서 예외를 처리하지 않고, 메소드를 호출한 곳으로 예외를 떠넘깁니다.

사용한 리소스 반납 방법

  1. finally 블록에서 리소스를 반납합니다.
  2. try-with-resource 문을 사용하여 자동으로 리소스를 반납합니다.

예제 코드

다음은 예외 처리의 예제 코드입니다.

Run 클래스

package k.exception.ex1;

import java.io.IOException;
import java.util.Scanner;

public class Run {

    public static void main(String[] args) {
        RunException ex = new RunException();

       // try-with-resource를 이용한 예외 처리
        try(Scanner sc = new Scanner(System.in);) {
            ex.methodA();
        } catch (IOException e) {
            System.out.println("main에서 해결");
            e.printStackTrace();
        }

        ex.myInfo(null);
    }
}

CustomException 클래스

package k.exception.ex1;

public class CustomException extends RuntimeException {

    public CustomException() {
        super();
    }

    public CustomException(String message) {
        super(message);
    }
}

RunException 클래스

package k.exception.ex1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class RunException {    
    public void method01() {
        Scanner sc = new Scanner(System.in);
        try {
            System.out.print("a/b...a : ");
            int n1 = sc.nextInt();

            System.out.print("a/b...b : ");
            int n2 = sc.nextInt();

            System.out.printf("%d / %d = %d \n", n1, n2, n1 / n2);
            System.out.println("트라이종료");

        } catch(Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        System.out.println("good bye~~");
    }

    public void method02() {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = null;

        // 1. try ~ catch문 : 여기서 곧바로 예외를 처리하겠다.
        try {
            str = br.readLine();
        } catch(IOException e) {
            e.printStackTrace();
        }

        System.out.println("입력 : " + str);
    }

    public void methodA() throws IOException {
        methodB();
    }

    public void methodB() throws IOException {
        methodC();
    }

    public void methodC() throws IOException {
        throw new IOException();
    }

    public void myInfo(String name) {
        System.out.println("안녕하세요");
        if(name == null) {
            throw new CustomException("name을 찾을 수 없습니다.");
        }
    }
}

예외 처리 예제 설명

  1. Run.java에서는 try-with-resource 문을 사용하여 Scanner 객체를 자동으로 닫고 있습니다. methodA에서 발생한 IOExceptioncatch 블록에서 처리하고 있습니다.
  2. CustomException.java에서는 사용자 정의 예외 클래스를 정의하고 있습니다.
  3. RunException.java에서는 다양한 예외 처리 방법을 보여주고 있습니다. method01에서는 try ~ catch 문을 사용하여 예외를 처리하고 있으며, method02에서는 BufferedReader를 이용한 입력 처리를 하고 있습니다. methodA, methodB, methodC에서는 예외를 메소드 호출 계층으로 떠넘기고 있습니다. myInfo 메소드에서는 CustomException을 사용하여 사용자 정의 예외를 발생시키고 있습니다.
profile
초보부터 시작하는 개발자 생활

0개의 댓글