Java/기본 프로그래밍

[JAVA] 예외 처리 ( try catch finally 문 )

KR_Jimi 2024. 1. 31. 22:46

예외 처리


  • 작성한 프로그램의 실행 중에 예외가 발생하면 이에 대응하는 것이다.
  • 예외 타입이란 아래에 있는 예외 클래스를 말한다.

try {
    예외가 발생할 가능성이 있는 실행문(try 블록)
}
catch (처리할 예외 타입 선언) {
    예외 처리문(catch 블록)
}
finally {
    예외 발생 여부와 상관없이 무조건 실행되는 문장(finally 블록){
}

예외 타입(예외 클래스) 예외 발생 경우 패키지
ArithmeticException 정수를 0으로 나눌 때 발생 java.lang
NullPointerException null 레퍼런스를 참조할 때 발생 java.lang
ClassCastException 변환할 수 없는 타입으로 객체를 변환할 때 발생 java.lang
OutOfMemoryError 메모리가 부족한 경우 발생 java.lang
ArrayIndexOutOfBoundsException 배열의 범위를 벗어난 접근 시 발생 java.lang
IllegalArgumentException 잘못된 인자 전달 시 발생 java.lang
IOException 입출력 동작 실패 또는 인터럽트 시 발생 java.io
NumberFormatException 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환 시 발생 java.lang
InputMismatchException Scanner 클래스의 nextInt()를 호출하여 정수로 입력받고자 하였지만, 사용자가 'a' 등과 같이 문자를 입력한 경우 java.util

예시ArithmeticException


두 정수를 입력받아 나눗셈을 하고 몫을 구하는 프로그램 코드이다. 사용자가 나누는 수에 0을 입력하면 ArithmeticException 예외가 발생하여 프로그램이 강제 종료된다.


import java.util.Scanner;

public class DivideByZero {
    public static void main(String[]args) {

        Scanner scanner = new Scanner(System.in);

        int dividend;
        int divisor;

        System.out.print("나뉨수를 입력하시오:");
        dividend = scanner.nextInt();
        System.out.print("나눗수를 입력하시오:");
        divisor = scanner.nextInt();
        System.out.println(dividend+"를 "+divisor+"로 나누면 몫은 "+ dividend/divisor +"입니다.");
        scanner.close();
    }
}

실행결과
나뉨수를 입력하시오:100
나눗수를 입력하시오:0
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at DivideByZero.main(DivideByZero.java:15)

예시ArithmeticException e


try-catch 블록을 이용하여 예제 3-14를 수정하여, 정수를 0으로 나누는 경웨 "0으로 나눌 수 없습니다!"를 출력하고 다시 입력 받는 프로그램을 작성하라.


import java.util.Scanner;
public class DevideByZeroHandling {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while(true) {
            System.out.print("나뉨수를 입력하시오:");
            int dividend = scanner.nextInt();
            System.out.print("나눗수를 입력하시오:");
            int divisor = scanner.nextInt();
            try {
                System.out.println(dividend+ "를 "+ divisor + "로 나누면 몫은 "+ dividend/divisor + "입니다.");
                break;
            }
            catch (ArithmeticException e){
                System.out.println("0으로 나눌 수 없습니다.! 다시 입력하세요");
            }
        }
        scanner.close();
    }
}

실행결과
나뉨수를 입력하시오:100
나눗수를 입력하시오:0
0으로 나눌 수 없습니다.! 다시 입력하세요
나뉨수를 입력하시오:18
나눗수를 입력하시오:6
18를 6로 나누면 몫은 3입니다.

예시ArrayIndexOutOfBoundsException


배열의 인덱스가 범위를 벗어날 때 발생하는 ArrayIndexOutOfBoundsException을 처리하는 프로그램을 작성하라.



public class ArrayException {
    public static void main(String[] args) {
        int[] intArray = new int[5];
        intArray[0] = 0;
        try {
            for (int i=0; i<5; i++) {
                intArray[i+1] = i+1 + intArray[i];
                System.out.println("intArray["+i+"]"+"="+intArray[i]);
            }
        }
        catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("배열의 인덱스가 범위를 벗어났습니다.");
        }
    }
}

실행결과
intArray[0]=0
intArray[1]=1
intArray[2]=3
intArray[3]=6
배열의 인덱스가 범위를 벗어났습니다.

예시InputMismatchException


3개의 정수를 입력받아 합을 구하는 프로그램을 작성하라. 사용자가 정수가 아닌 문자를 입력할 때 발생하는 InputMismatchException 예외를 처리하여 다시 입력받도록 하라.


 import java.util.Scanner;
import java.util.InputMismatchException;

public class InputException {
    public static void main(String [] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("정수 3개를 입력하세요");
        int sum=0,n = 0;

        for(int i=0; i<3; i++) {
            System.out.print(i+">>");
            try {
                n = scanner.nextInt();
            }
            catch(InputMismatchException e) {
                System.out.println("정수가 아닙니다. 다시 입력하세요!");
                scanner.nextLine();
                i--;
                continue;
            }
            sum += n;
        }
        System.out.println("합은 "+ sum);
        scanner.close();
    }

}

 실행결과
 정수 3개를 입력하세요
0>>6
1>>K
정수가 아닙니다. 다시 입력하세요!
1>>3
2>>9
합은 18

scanner.nextLine()을 사용하는 이유는 현재 입력 스트림에 남아 있는 토큰을 지우기 위해서이다. i--;를 하는 이유는 잘못 증가된 제어변수를 다시 감소시키기 위해서이다. continue;를 하여서 올바르지 않은 값을 더하지 않고 아래의 코드를 넘어간다.

예시NumberFormatException


문자열을 정수로 변환할 때 발생하는 NumberFormatException을 처리하는 프로그램을 작성하라.



public class NumException {
    public static void main(String[] args) {
        String[] stringNumber = {"23", "12", "3.141592", "998"};

        int i=0;
        try {
            for (i=0; i<stringNumber.length; i++) {
                int j = Integer.parseInt(stringNumber[i]);
                System.out.println("정수로 변환된 값은 "+j);
            }
        }
        catch (NumberFormatException e) {
            System.out.println(stringNumber[i]+ "는 정수로 변환할 수 없습니다.");
        }
    }
}

실행결과
정수로 변환된 값은 23
정수로 변환된 값은 12
3.141592는 정수로 변환할 수 없습니다.

Integer.parseInt()에 대한 추가 보충이 필요하다.