반응형

예외처리란?

  • 프로그램 실행 중 예외가 발생할 수 있는데, 이때 이를 어떻게 처리할 건지 등을 미리 대처하는 코드를 작성하는 것
  • 예외처리를 통해 프로그램의 정상 작동을 보장할 수 있으며, 예외의 원인 파악, 예외 정보 기록 등을 할 수 있음.

예외의 종류

  • 예외의 종류로는 오류(Error), CheckedException, UncheckedException( = RuntimeException)으로 구분
  • Error는 시스템의 문제로 인해 발생하기 때문에 Error가 발생하면 프로그램을 종료시키는 것이 일반적임
    • ex) OutOfMemory, StackOverflow
  • CheckedException은 예외처리를 반드시 해야하고, 안하면 컴파일 에러가 발생함
    • ex) IOException, FileNotFoundException, …
  • UncheckedException은 예외처리를 강제하지 않음, RuntimeException이라고도 함
    • ex) ArithmeticException, ArrayIndexOutOfBoundsException, …

예외처리 종류

  1. try - catch - finally
  2. throws

try - catch - finally 란?

  • try 부분에서 예외가 발생할 가능성이 있는 코드를 작성하고
  • catch 부분에서는 try 부분에서 예외 발생 시, 어떻게 처리할지에 대한 코드를 작성
  • finally 부분은 있어도 되고 없어도 되는데, try - catch 이후에 예외 발생 여부와 상관 없이 실행됨

try - catch - finally 예제

package ExceptionTest;

public class Main {

    public static void main(String[] args) {
        int a;
        try {
            a = 12 / 0;
            System.out.println(a);
        } catch(Exception e) {
            System.out.println("에러 발생");
            e.printStackTrace();    // 예외 발생 위치와 원인 출력
                                    // e.toString(), e.getMessage()등 으로 간단하게 출력도 가능함
        } finally {
            System.out.println("종료");
        }
    }
}
  • 위 코드에선 값을 0으로 나누기 때문에 예외가 발생함
  • 정확히는 ArithmeticException이 발생하는데, Exception은 이를 포함한 모든 exception과 상속관계여서 Exception으로 받을 수 있음
  • 만약 exception의 종류에 따라 catch문을 다르게 하고 싶다면 catch문을 여러개 써주고 각각의 파라미터 자리에 서로 다른 exception 명을 써주면 됨

throws 란?

  • 예외가 발생할 수 있는 메서드 뒤에 throws + 예외종류를 붙여줌으로서 자신을 호출한 상위 메서드로 예외를 던져줌
  • 만약 main 메소드 뒤에 throws가 있다면 이는 JVM으로 예외를 던져줌
    • JVM으로 던지는것 보다는 그 전에 어딘가에서는 예외 처리를 직접 해주는 방식 추천

throws 예제

package ExceptionTest;

public class Main {

    public static void divide(int a, int b) throws Exception {
        System.out.println(a + " / " + b + " = " + a/b);
    }
    public static void main(String[] args) {
        try {
            divide(12, 0);
        } catch(ArithmeticException e) {
            System.out.println("계산 오류");
            e.printStackTrace();
        } catch(Exception e) {
            System.out.println("기타 예외 발생");
            e.printStackTrace();
        }
    }
}

결과

throw 란?

  • throw 메소드를 통해서 개발자가 임의로 에외를 직접 발생시킬 수도 있음
throw new IOException();

위의 throws 예제를 아래와 같이 조금 수정해봄

package ExceptionTest;

public class Main {

    public static void divide(int a, int b) throws Exception {
        // System.out.println(a + " / " + b + " = " + a/b);
        throw new IOException();
    }
    public static void main(String[] args) {
        try {
            divide(12, 0);
        } catch(ArithmeticException e) {
            System.out.println("계산 오류");
            e.printStackTrace();
        } catch(Exception e) {
            System.out.println("기타 예외 발생");
            e.printStackTrace();
        }
    }
}

결과

  • 결과는 아래와 같이 try 문에서 exception이 잡히는데 ArithmeticException이 아니므로 "기타 예외 발생"이 출력됨

반응형

↓ 클릭시 이동

복사했습니다!