Programming Language/Java

예외 처리해보기

Ma_Sand 2022. 3. 12. 22:04
반응형

1. ArithmeticException 클래스

  : 0으로 나눴을 때 예외 발생

// ArithmeticException

// 사용자에게 정수값 2개를 입력받아 나눗셈 출력하기
public void arith() {
    Scanner sc = new Scanner(System.in);  // 스캐너로 입력받기
    
    System.out.println("num1: ");
    int num1 = sc.nextInt();  // 첫 번째 정수 num1
    
    System.out.println("num2: ");
    int num2 = sc.nextInt();  // 두 번째 정수 num2
    
    
    // 조건문(if문)으로 처리하기 <- 처음부터 예외가 발생하지 않도록.
    if(num2 != 0) {  // 나누는 수 num2가 0이 아닐 때엔 나눗셈값 출력
        System.out.println(num1 / num2);
    } else {  // num2가 0일 때엔 0으로 나눌 수 없다고 출력
        System.out.println("0으로 나눌 수 없음");
    }
    System.out.println("프로그램을 종료합니다.");
    
    
    // try ~ catch문으로도 처리해보기
    try {  // (num1/num2)값을 출력한다.
        System.out.println(num1 / num2);
    }
    // num2가 0일 때 발생하는 예외 ArithmeticException
    catch(ArithmeticException e) {  // 대개 예외처리변수는 'e'로 한다.
        System.out.println("0으로 나눌 수 없음");
        e.printStackTrace();  // 예외 발생한 곳 추적
    }
    System.out.println("프로그램을 종료합니다.");
}

 

 

 

2. 다중 catch 블록

  : catch를 하려는 예외가 여러 개일 때 사용한다.
    이때, 범위가 좁은 예외 자식클래스부터 작성해야 한다. 왜냐하면 예외처리 자식 클래스들은 다형성이 적용되므로

    넓은 범위의 예외 클래스(부모 클래스)가 맨위에 오면 부모 클래스가 모든 예외를 처리해버려서 자식 클래스는

    실행할 수 없기 때문이다.

// 다중 catch 블록

// 사용자에게 정수값을 입력받아 나눗셈값 출력하기
public void doubleCatch() {
    Scanner sc = new Scanner(System.in);
    
    System.out.println("0을 제외한 정수를 입력하세요. ");
    
    try {
        int num = sc.nextInt();  // 입력값 num
        System.out.println(100 / num);  //
    } catch(InputMismatchException e) {  // 정수가 아닌 다른 타입의 값이 입력됐을 때 발생하는 예외
        System.out.println("정수만 입력하세요.");
        e.printStackTrace();  // 예외 발생 추적
    } catch(ArithmeticException e) {  // 입력값이 0일 때
        System.out.println("0으로 나눌 수 없습니다.");
        e.printStackTrace();  // 예외 발생 추적
    }
    System.out.println("프로그램을 종료합니다.");
}

 

 

 

3. 배열을 활용한 예외 처리

// 사용자에게 배열의 크기를 입력받아 배열을 만들기
// 50번 인덱스값을 출력하기
public void array() {
    Scanner sc = new Scanner(System.in);
    
    System.out.println("음수를 제외한 배열의 크기를 입력하세요. ");
    
    try {
        int size = sc.nextInt();
        int[] arr = new int[size];
        System.out.println(arr[50]);
    } catch(InputMismatchException e) {  // 정수가 아닌 값을 입력했을 때
        System.out.println("정수를 입력하세요.");
    } catch(NegativeArraySizeException e) {  // 배열의 크기를 음수로 지정했을 때
        System.out.println("배열의 크기는 음수로 지정할 수 없습니다.");
    } catch(ArrayIndexOutOfBoundsException e) {  // 배열의 인덱스 범위를 넘어서 참조했을 때
        System.out.println("배열의 크기를 벗어났습니다.");
    } catch(RuntimeException e) {  // 작성한 예외 이외의 예외가 발생할 경우 모든 예외를 처리
      // RuntimeException을 맨위에 작성하면 위의 세 예외 클래스는 실행되지 않는다.
        System.out.println("프로그램 실행 시 오류가 발생합니다.");
    }
    System.out.println("프로그램을 종료합니다.");
}


// 만약 RuntimeException을 맨위에 적어서 한번에 예외 처리되었을 경우
// 타입을 확인해보고 싶다면 instanceof 연산자를 사용하면 된다.

try {
    int size = sc.nextInt();
    int[] arr = new int[size];
    System.out.println(arr[50]);
} catch(RuntimeException e) {
    System.out.println("프로그램 실행 시 오류가 발생합니다.");
    
    if(e instanceof InputMismatchException) {
        System.out.println("InputMismatchException이 발생하였습니다.");
    } else if(e instanceof NegativeArraySizeException) {
        System.out.println("NegativeArraySizeException이 발생하였습니다.");
    }
    System.out.println("프로그램을 종료합니다.");
}

 

 

 

4. NullPointerException 클래스

public void npe() {
    String str = null;
    
    try {
        System.out.println(str.charAt(0));
    } catch(NullPointerException e) {  // null인 참조변수로 객체 멤버를 참조하려해 예외 발생
        System.out.println("null값이 발생하였습니다.");
    }
}
반응형