Programming Language/Java

예외 처리(Exception)

Ma_Sand 2022. 3. 11. 21:56
반응형

1. 에러(Error, =오류)

  : 프로그램을 수행할 때 치명적인 상황이 발생하여 비정상적인 종료 상황이 발생한 것을 프로그램 에러라고 한다.

 

 (1) 종류

   ① 논리 에러

      : 소스코드 상의 문법적 오류가 없고, 프로그램을 실행했을 때에도 문제가 없지만 프로그램의 의도상 맞지 않을 때 발생하는 에러(기획과 설계가 잘못됨)

 

   ② 시스템 에러

      : 컴퓨터의 오작동으로 인해 발생하는 에러이며, 소스코드로 해결되지 않는다.(심각한 에러)

 

   ③ 컴파일 에러

      : 프로그램을 실행하기 전에 소스코드 상의 문법적인 문제로 발생하는 에러이며, 소스코드를 수정하여 해결한다.

 

   ④ 런타임 에러

      : 프로그램을 실행하는 도중에 발생하는 에러이며, 소스코드 상의 문제가 없음에도 발생한다.(사용자의 잘못으로 발생하거나 개발자가 경우의 수를 처리하지 않음)

 

 

 (2) 해결 방법

    : 예외 처리를 통해 해결한다.

 

 

 

2. 예외 처리

 (1) 예외

    : 시스템 에러를 제외한 에러를 말하며, 주로 런타임 에러를 다룬다.

 

 

 (2) 예외 처리

    : 예외가 발생했을 때 프로그램이 비정상적으로 종료되는 것을 막기 위해 예외를 처리하는 방법을 정의해둔 것

 

 

 (3) RuntimeException 클래스(부모 클래스)

    : Unchecked Exception에 해당하며, 이의 예외는 충분히 예측 가능하므로 예외 처리가 필수는 아니다.

 

   ① RuntimeException의 자식 클래스

     ⓐ ArrayIndexOutOfBoundsException 클래스

        : 배열의 인덱스 범위를 벗어나서 참조한 경우에 발생한다.

          이때, '배열명.length'를 사용하여 배열의 범위를 확인한다.

 

     ⓑ ClassCastException 클래스

        : Cast 연산자를 사용했을 때 허용할 수 없는 형변환이 진행된 경우에 발생한다.

          이때, instanceof 연산자로 객체 타입을 확인한 후 cast 연산을 한다.

 

     ⓒ NullPointerException 클래스

        : 참조 변수가 null인데도 객체 멤버를 참조하려고 할 경우에 발생한다.

          이때, 객체를 사용하기 전에 참조 변수가 null인지 확인한다.

 

     ⓓ ArithmeticException 클래스

        : 0으로 나눌 때 발생한다.

          이때, if문으로 나누는 수가 0인지 검사한다.

 

     ⓔ NegativeArraySizeException 클래스

        : 배열의 크기를 음수로 지정했을 경우에 발생한다.

          이때, 배열의 크기를 0보다 크게 지정해야 한다.

 

   ② 관련 예외

     ⓐ 예외가 예측 가능한 상황일 때엔 조건문으로 해결하는 것을 권장한다.

     ⓑ 예외가 예측 불가한 상황일 때엔 예외 처리 구문으로 해결한다.

 

 

 (4) 예외 처리 방법

   ① 메소드를 선언할 때 throws ExceptionName문을 추가하여 호출한 상위 메소드에 처리를 위임한다.

       만약, 계속 호출한 메소드에 위임하여 main()까지 가서 이 main()에서도 처리하지 않으면 비정상적으로 종료된다.

   ② try ~ catch문을 이용하여 예외를 처리한다.

public static void main(String[] args) {  // method3의 예외를 try ~ catch문으로 처리
    Test t = new Test();
    
    try {
        t.method1();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        System.out.println("프로그램을 종료합니다.");
    }
}

public void method1() throws IOException {  // main()에 처리 위임
    method2();
}

public void method2() throws IOException {  // method1()에 처리 위임
    method3();
}

public void method3() throws IOException {  // Exception 발생 -> method2()에 처리 위임
    throw new Exception();
}
반응형