오류를 처리하는 방법을 공부하기 전에 어떤 상황에서 오류가 발생하는지 살펴보자.
1. 존재하지 않는 파일을 열려고 시도하는 경우
BufferedReader br = new BufferedReader(new FileReader("나없는파일")); br.readLine(); br.close();
위 코드를 실행하면 다음과 같은 오류가 발생한다.
Exception in thread "main" java.io.FileNotFoundException: 나없는파일 (지정된 파일을 찾을 수 없습니다) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileReader.<init>(Unknown Source) ...
- 존재하지 않는 파일을 열려고 시도하면 FileNotFoundException라는 이름의 예외가 발생한다.
2. 0으로 다른 숫자를 나누는 경우
int c = 4 / 0;
위 코드를 실행하면 다음과 같은 오류가 발생한다.
Exception in thread "main" java.lang.ArithmeticException: / by zero at Test.main(Test.java:14)
- 4를 0으로 나누면 ArithmeticException 예외가 발생한다.
3. 리스트형 객체에서 선언되지 않은 요소를 get하는 경우
int[] a = {1, 2, 3}; System.out.println(a[3]);
위 코드를 실행하면 다음과 같은 오류가 발생한다.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at Test.main(Test.java:17)
- a[3]은 a 배열의 4번째 값이므로 a 배열에서 구할 수 없는 값이다. 그래서 ArrayIndexOutOfBoundsException 오류가 발생했다.
자바는 이와 같은 예외가 발생하면 프로그램을 중단하고 오류메시지를 보여준다.
예외 처리하기
- 예외 처리를 위한 try, catch문의 기본구조
try { ... } catch(예외1) { ... } catch(예외2) { ... }
- try 문안의 수행할 문장들에서 예외가 발생하지 않는다면 catch문에 속한 문장들은 수행되지 않는다. 하지만 try 문안의 문장을 수행하는 도중에 예외가 발생하면 예외에 해당되는 catch문이 수행된다.
숫자를 0으로 나누었을 때 발생하는 예외를 처리하려면 다음과 같이 할 수 있다.
int c; try { c = 4 / 0; } catch(ArithmeticException e) { c = -1; // 예외가 발생하여 이 문장이 수행된다. }
- ArithmeticException이 발생하면 c에 -1을 대입하도록 예외를 처리한 것이다. ArithmeticException e에서 e는 ArithmeticException 클래스의 객체, 즉 오류 객체에 해당한다. 이 오류 객체를 통해 해당 예외 클래스의 변수나 메서드를 호출할수도 있다.
일반 예외(Exception)와 실행 예외(Runtime Exception)
- 일반 예외 : 자바 소스를 컴파일 하는 과정에서 예외 처리 코드가 필요한지 검사하기 때문에 컴파일러 체크 예외, checked Exception이라고도 한다. 명시적으로 예외 처리를 해주지 않으면 컴파일 오류가 난다.
- 실행 예외 : 컴파일 하는 과정에서 예외 처리 코드를 검사하지 않는 예외, unchecked Exception 이라고도 한다. 명시적으로 예외 처리를 하지 않아도 컴파일 오류가 나지 않는다.
실행 예외는 자바 컴파일러가 체크를 하지 않기 때문에 오직 개발자의 경험에 의해서 예외 처리 코드를 삽입해야 한다. 만약 개발자가 실행 예외에 대해 예외 처리 코드를 넣지 않으면, 해당 예외 발생 시 프로그램은 종료된다.