본문 바로가기

코린이

혼공자 chapter10 예외 처리 본문

자바/혼공 학습단 10기

혼공자 chapter10 예외 처리

winsome99 2023. 7. 19. 00:23
반응형

10_1 예외 클래스

예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 뜻한다.

(예외는 예외 처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.)

자바에서 예외가 발생할 가능성이 높은 코드를 컴파일할 때 예외 처리 유무를 확인한다.

예외와 예외 클래스

예외에는 두 가지 종류(일반 예외, 실행 예외)가 있다.

  • 일반 예외: 컴파일 체크 예외라고도 한다. 프로그램 실행에서 예외 발생이 높아 컴파일하는 과정에서 예외 처리 코드가 있는지 검사

  • 실행 예외: 실행 시 예측할 수 없이 갑자기 발생해 컴파일 과정에서 예외 처리 코드가 있는지 검사하지 않는다.
  • 자바에서는 예외를 클래스로 관리해 JVM은 프로그램 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성 후 예외 처리 코드에서 예외 객체를 이용할 수 있게 해 준다.

 

실행 예외

자바 컴파일러가 체크하지 않아 개발자의 경험에 의해 예외 처리 코드를 작성

NullPointerException

자바에서 빈번하게 발생하는 실행 예외

package week10;

public class NullPointerException {
    public static void main(String[] args) {
        String data = null;
        System.out.println(data.toString());
    }
}

null 값을 갖는 참조 변수로 객체 접근 연산자 도트 .를 사용할 때 발생

이외에도 ArrayIndexOutofBoundsException, NumberFormantException, ClassCastException 예외처리가 있다.

10_2 예외 처리

자바 컴파일러는 소스 파일을 컴파일할 때 일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 에러를 발생시켜 개발자가 강제로 예외 처리 코드를 요구한다.

예외 처리 코드

try-catch-finally

생성자 내부와 메소드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외 처리를 할 수 있도록 해준다.

  • 이미지 참조
출처: https://howtodoinjava.com/java/exception-handling/try-catch-finally/

다중 catch

try 내부에는 다양한 예외가 발생할 수 있어 예외 처리 코드를 전부 다르게 하려면 다중 catch 블록을 작성해야 한다.

try 블록에서 해당 타입의 예외가 발생하면 catch 블록을 실행하도록 되어 있다.

catch가 여러 개라 해도 하나의 catch 블록만 실행한다.

그 이유는 try 블록에서 동시 다발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멈춰 catch 블록으로 이동한다.

package week10;

public class MultiCatchExample {
    public static void main(String[] args) {
        try {
            int[] numbers = {1, 2, 3};
            int index = 4;

            //배열 인덱스를 벗어나는 예외(IndexOutOfBoundsException)를 발생
            int result = numbers[index];

            //숫자로 변환할 수 없는 문자열을 숫자로 변환하려 할 때 예외(NumberFormatException)를 발생
            String nonNumericString = "ABC";
            int numericValue = Integer.parseInt(nonNumericString);

        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("배열 인덱스를 벗어났습니다.");
        } catch (NumberFormatException e) {
            System.out.println("숫자로 변환할 수 없는 문자열입니다.");
        } catch (Exception e) {
            System.out.println("일반 예외가 발생했습니다.");
        }

        System.out.println("프로그램 종료");
    }
}

NumberFormatException 예외를 추가하여 문자열 "ABC"를 숫자로 변환하는 과정에서 발생하는 예외를 처리합니다. 이제 코드를 실행하면 **NumberFormatException**에 대한 catch 블록이 실행되는 것을 확인할 수 있다.

실행 결과

 

catch 순서

try 블록에 ArrayIndexOutofBoundsException이 발생하면 첫 번째 catch 블록을 실행하고, 다른 예외가 발생하면 두 번째 catch 블록을 실행한다.

예외 떠넘기기

메소드를 호출한 곳으로 예외를 떠넘길 수 있다. 이때 사용하는 키워드가 throw 키워드로 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다.

리턴타입 메소드이름(매개변수,...) throws 예외클래스1, 예외클래스2, ... {}
리턴타입 메소드이름(매개변수,...) throws Exception{}

throw 키워드가 붙어 있는 메소드는 반드시 try블록 내에서 호출하여야 한다.

package week10;

public class ThrowExample {
    public static void main(String[] args) {
        try{
            findClass();
        } catch (ClassNotFoundException e){
            System.out.println("클래스가 존재하지 않습니다.");
        }
    }
    public static void findClass() throws ClassNotFoundException{
        Class clazz = Class.forName("java.lang.String2");
    }
}

예외를 직접 발생시키는 throw 예약어를 사용하는 간단한 예시로 위의 코드는 findClass() 메서드에서 **ClassNotFoundException**을 발생시키고, 호출한 쪽인 main() 메서드에서 이 예외를 처리하는 것을 보여준다. throws 키워드를 사용하여 예외를 전파하고, catch 블록을 사용하여 예외를 처리하는 것이 Java에서 예외 처리 메커니즘의 기본적인 방법이다.

 

 

반응형

'자바 > 혼공 학습단 10기' 카테고리의 다른 글

혼공단 3주차 미션  (0) 2023.07.23
혼공자 Chapter11 API  (0) 2023.07.21
혼공자 chapter08 인터페이스  (0) 2023.07.15
혼공자 Chapter07. 상속  (0) 2023.07.14
혼공자 2주차 미션  (0) 2023.07.14
Comments