반응형

 

프로그램에서 예외는 실행 중 오작동이나 결과에 악영향을 미치는 예상치 못한 상황을 의미합니다. 보통 문법에 맞지 않게 코드가 작성된 경우에는 컴파일러에 의해 컴파일 오류로 걸러지지만, 사용자의 잘못된 입력이나 배열의 범위를 넘어서는 접근에 의해 종종 발생합니다. 

예외 발생 경우를 몇 가지 나열하자면,

  • 정수를 0으로 나누는 경우
  • 배열의 크기보다 큰 인덱스로 배열의 원소를 접근하는 경우
  • 정수를 읽는 코드가 실행되고 있을 때 사용자가 문자를 입력한 경우

 

try-catch-finally문

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

try블록에서 예외가 발생하지 않은 경우에는 finally블록으로 넘어가고 만약 예외가 발생했다면 catch블록의 예외처리 문으로 넘어가 예외를 처리하고 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

 

확인해보기 위해서 배열의 범위를 벗어나게 접근을 해봤더니

package blog;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int arr[] = new int[5];
		arr[6] = 3;
	}
}

위와 같은 오류가 발생하였다. (ArrayIndexOutOfBoundsException)

 

try-catch-finally문을 이용하여 예외처리를 할 경우 아래와 같이 나타낼 수 있다.

package blog;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		try {
			int arr[] = new int[5];
			arr[6] = 3;
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("배열의 범위를 벗어났습니다.");
		}
		finally
		{
			// 많은 경우 finally블록은 생략
		}	
	}
}

다수의 예외를 처리하고자 할 때는 여러 개의 catch문을 연속적으로 작성할 수 있다.

 

예외처리 연습 코드 - 세 정수를 입력받고 입력받을 때마다 각 정수로 100을 나눈 값을 출력

package blog;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.println("정수 3개를 입력하세요.");
		
		int result = 100, n = 0;
		
		for (int i = 0; i < 3; i++) {
			System.out.print(i+">>");
			try {
				n =  sc.nextInt();
				System.out.println(100/n);
			} 
			catch (ArithmeticException e) {
				System.out.println("0으로 나눌 수 없습니다. 다시 입력하세요.");
				i--;
				continue;
			}
			catch (InputMismatchException e) {
				System.out.println("정수가 아닙니다. 다시 입력하세요.");
				i--;
				sc.next(); // 무한루프를 방지하기 위해 입력 스트림에 있는 토큰을 비움
				continue;
			} 
		}
		sc.close();
	}
}

 

 

 

 

출처 -명품 자바 에센셜 (저자 : 황기태)

반응형

+ Recent posts