예외 처리
- 작성한 프로그램의 실행 중에 예외가 발생하면 이에 대응하는 것이다.
- 예외 타입이란 아래에 있는 예외 클래스를 말한다.
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()에 대한 추가 보충이 필요하다.