우리가 흔히 코드를 짜면서 컴파일을 실행하면

compile time error

위와 같은 에러를 얻기 쉽상인데, 이것은 컴파일러가 잘못된 문법으로 짜여졌다고 우리에게 알려주는 에러이다. (아이고 친절해라)

하지만 오늘 우리가 알아볼 에러는 사용자의 잘못된 입력이나 배열의 인덱스가 배열의 크기를 넘어가는 등의 예기치 못한 상황에 발생하는 에러를 의미한다.

자바에서  예외(Exception)는 오작동이나 결과에 악영향을 미칠 수 있는 실행중 발생한 오류 라고 정의하고 있다.

대표적으로 예외가 발생하는 경우는 아래와 같다

1. 정수를 0 으로 나누기를 할 경우

2. 배열의 크기보다 큰 인덱스로 배열의 원소를 접근하는 경우

3. 존재하지 않는 파일을 읽으려고 하는경우

4. 정수를 입력받는 코드가 실행될 때, 사용자가 문자를 입력한 경우 등

이처럼 예외가 발생하는 경우는 많으며, 만약 이러한 예외를 대처하기 위한 코드가 존재한다면, 응용프로그램은 사용자에게 예외의 내용을 전달하지만 만약 대처를 위한 코드가 존재하지 않는다면 자바 플랫폼은 응용프로그램을 강제로 종료시킨다.

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();
	}
}

위 코드에서 divisor 을 0 으로 입력한다면 아래와 같은 에러가 출력되며 응용프로그램이 종료된다.

Exception in thread "main" java.lang.ArithmeticException: / by zero
at DivideByZero.main(ExceptionExample1.java:14)

위 코드처럼 사용자의 입력을 통해 발생하는 에러는 컴파일 할 때 잡아낼 수 없으므로, 우리는 이를 조치하기 위해 예외를 대응하는 코드를 작성하는 습관을 키워야한다.

이러한 예외를 처리하기 위해 사용되어지는 방법이 try - catch - finally 문을 사용하는 방법인데, 사용 방법은 아래 코드와 같다.

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

finally 블록은 생략해도 괜찮고, 대부분 경우에 생략한다.

 

int intArray[] = new int[5];
try{
	intArray[3] = 2;
    	intArray[6] = 5; // 이부분에서 인덱스보다 배열의 크기가 넘어감
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("배열 범위 초과");
}

위 코드처럼 배열의 범위보다 큰 인덱스를 입력한다면, catch 문을 통해 오류 내용을 리턴하고, 예외를 처리할 수 있다.

또한 다수의 예외를 처리하고자 하는 경우에는 다중 catch 문을 사용하여줘도 무방하다.

다만 주의할 점은 예외의 타입과 일치하는 catch 문이 없다면 응용프로그램은 강제 종료된다.

또한  catch 블록 내에서 System.exit(0) 을 호출하면 언제든 프로그램을 강제로 종료할 수 있다.


마지막으로 자주 등장하는 예외 타입을 정리하며 오늘도 마무리 하겠다

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

그럼 오늘도 20000!