Java

예외

공부처음하는사람 2024. 7. 9. 14:46

 

예외란 잘못된 사용 또는 코딩으로 인한 오류를 말한다.

 

예외가 발생하면 프로그램은 종료된다는 점에서 에러와 동일하지만, 예외처리를 하면

 

프로그램이 종료되지 않고 실행상태를 유지할 수 있다.

 

예외에는 두가지가 있다.

- 일반 예외 (Exception)

컴파일러가 예외 처리 코드 여부를 검사하는 예외

- 실행 예외 (Runtime Exception)

컴파일러가 예외 처리 코드 여부를 검사하지 않는 예외

 

자바는 예외가 발생하면 예외 클래스로부터 객체를 생성한다. 이 객체는 예외 처리 시 사용된다.

 

자바의 모든 에러와 예외 클래스는 Throwable을 상속받아 만들어지고, 추가적으로 예외 클래스는 java.lang.Exception 클래스를

상속받는다.

 

실행 예외는 RuntimeException과 그 자식 클래스에 해당한다.

그 이외의 예외는 모두 일반 예외이다. 위 그림 (보기안좋지만)은 자바의 표준 라이브러리에서 제공하는 예외 클래스이다.

 

예외처리 코드

예외처리 코드는 try - catch - finally 블록으로 구성된다. 이 블록은 생성자 내부, 메소드 내부에 작성된다.

예외가 발생하면 catch 블록이 실행되어 예외처리를 담당하게 된다.

 

package ch11.sec02.ex01;

public class ExceptionHandlingEx2 {
    public static void printLength(String data) {
        try {
            int result = data.length();
            System.out.println("문자 수 : " + result);
        } catch (NullPointerException e) {
            System.out.println(e.getMessage());
//            System.out.println(e.toString()); // 예외 정보를 얻는 방법들
//            e.printStackTrace();
        } finally {
            System.out.println("[마무리 실행]\n");
        }
    }

    public static void main(String[] args) {
        System.out.println("[프로그램 시작]\n");
        printLength("ThisIsJava");
        printLength(null);
        System.out.println("프로그램 종료");
    }
}

 

예외가 발생하면 예외 객체가 catch 선언부의 예외 클래스 변수에 대입된다.

e.getMessage는 예외가 발생한 이유만 리턴하지만 e.toString은 예외의 종류도 같이 리턴한다

e.printStackTrace는 예외가 어디서 발생했는지 추적해서 알려준다.

 

 

다중  catch

catch 블록을 여러개 작성하더라도 catch 블록은 하나만 실행된다. 그 이유는 try 블록에서 동시다발적으로 예외가 발생하지 않으며

하나의 예외가 발생하면 실행을 멈추고 catch 블록으로 이동하기 때문이다.

package ch11.sec03.ex01;

public class ExceptionHandlingEx {
    public static void main(String[] args) {
        String[] array = {"100", "1oo"};

        for (int i = 0; i <= array.length; i++) {
            try {
                int value = Integer.parseInt(array[i]);
                System.out.println("array[" + i + "]: " + value);
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("배열 인덱스가 초과됨: " + e.getMessage());
            } catch (NumberFormatException e) {
                System.out.println("숫자로 변환할 수 없음: " + e.getMessage());
            }
        }
    }
}

 

 

두개 이상의 예외를 하나의 catch 블록으로 예외처리하고 싶을 땐 | 를 사용하면 된다.

catch (NullPointerException | NumberFormatException e) {
                System.out.println("데이터에 문제가 있음: " + e.getMessage());
            }

 

'Java' 카테고리의 다른 글

객체 문자정보 - toString()  (0) 2024.07.09
Object 클래스 / HashCode  (0) 2024.07.09
익명 객체  (0) 2024.07.06
중첩 인터페이스  (0) 2024.07.06
로컬 클래스 / 바깥 클래스  (0) 2024.07.06