Chap07 예외 처리 7.1 예외의 개요 7.2 예외 관련 클래스 7.3 예외 처리
7.1 예외의 개요 예외 : 프로그램 실행 중에 발생하는 예기치 않은 사건 예외가 발생하는 예 정수를 0으로 나누는 경우 배열의 첨자가 음수 또는 범위를 벗어나는 경우 부적절한 형 변환이 일어나는 경우 입출력을 위한 파일이 없는 경우 등 자바 언어는 프로그램에서 예외를 처리할 수 있는 기법을 제공
7.1 예외의 개요 예외가 발생되는 예 class Error { public static void main(String[] args) { x(); // x() 메소드 호출 } static void x() { y(); // y() 메소드 호출 static void y() { z(); // z() 메소드 호출 static void z() { int i = 1; int j = 0; System.out.println(i/j); // 1을 0으로 나눈다. 예외 발생 } // JVM의 묵시적인 예외 처리기 가동 에러 메시지 java.lang.ArithmeticException: / by zero at Error.z(Error.java:14) at Error.y(Error.java:9) at Error.x(Error.java:6) at Error.main(Error.java:3)
7.2 예외 관련 클래스 자바는 예외를 객체로 취급 예외 관련 클래스를 java.lang 패키지에서 제공 예외 관련 클래스 : 그림 7-1 참조 자바 프로그램에서는 Error, RuntimeException 클래스의 하위 클래스들을 제외한 모든 예외를 처리하여야 한다 일반적으로 Error, RuntimeException 클래스(하위 클래스 포함)들과 연관된 예외는 프로그램에서 처리하지 않는다 이유 : 예외를 처리하여 얻는 이득보다 예외를 처리하기 위한 노력이 너무 크기 때문
7.2 예외 관련 클래스 예외 클래스 계층구조 Object Throwable Error Exception LinkageError ThreadDeath VirtualMachineError RuntimeException CloneNotSupportedException IllegalAccessException InstantiationException InterruptedException NoSuchMethodException ClassNotFoundException IOException EOFException FileNotFoundException InterruptedIOException ClassCastException ArithmeticException NegativeArraySizeException NullPointException ArrayStoreException IndexOutOfBoundException (ArrayIndexOutOfBoundsException StringIndexOutOfBoundsException) SecurityException 예외 클래스 계층구조 (프로그램에서 처리하지 않고, JVM에게 예외처리를 맡긴다)
7.2 예외 관련 클래스 Exception 클래스의 하위 클래스 클래스 설명 NoSuchMethodException 메소드가 존재하지 않을 때 ClassNotFoundException 클래스가 존재하지 않을 때 CloneNotSupportedException 객체의 복제가 지원되지 않는 상황에서의 복제 시도 IllegalAccessException 클래스에 대한 부정 접근 InstantiationException 추상클래스나 인터페이스로부터 객체 생성하려 할 때 InterruptedException 스레드가 인터럽트 되었을 때 RuntimeException 실행시간 예외가 발생할 때
7.2 예외 관련 클래스 RuntimeException 클래스의 하위 클래스 클래스 설명 ArithmeticException 0으로 나누는 등의 산술적인 예외 NegativeArraySizeException 배열의 크기를 지정할 때 음수의 사용 NullPointerException null 객체의 메소드나 멤버 변수에 접근할 때 IndexOutOfBoundException 배열이나 스트링의 범위를 벗어난 접근. 하위클래스로 ArrayIndexOutOfBoundsException 클래스 와 StringIndexOutOfBoundsException 클래스를 제공 SecurityException 보안을 이유로 메소드를 수행할 수 없을 때
7.3 예외 처리 Error 와 RuntimeException 클래스 관련 예외는 처리 효율보다는 처리에 드는 노력이 너무 커 자바 프로그램에서 처리하지 않고 JVM에게 처리를 맡긴다 Error 와 RuntimeException 외에 다른 클래스들과 연관된 예외들은 자바 프로그램에서 직접 처리하여야 한다. 예외를 처리하는 방법은 두 가지 예외가 발생된 메소드 내에서 처리하는 방법(try, catch 절 사용) 예외가 발생된 메소드를 호출한 메소드에게 예외의 처리를 넘겨주는 방법(throws 절 사용)
7.3 예외 처리 예외의 발생 import java.io.*; class IOExceptionError { public static void main(String args[]) { FileReader file = new FileReader("a.txt"); // 만일 a.txt 파일이 없다면? int i; while((i = file.read()) != -1) { System.out.print((char)i); } file.close(); 이 프로그램은 컴파일러에 의해 에러가 발생된다. 즉 컴파일러는 a.txt 파일이 없을 경우에 발생하는 예외의 처리를 요구한다
7.3 예외 처리 컴파일러는 앞의 프로그램에 대해 다음과 같은 에러 메시지를 나타낸다 IOExceptionError.java:7: Exception java.io.FileNotFoundException must be caught, or it must be declared in the throws clause of this method. FileReader file = new FileReader("a.txt"); ^ IOExceptionError.java:11: Exception java.io.IOException must be caught, or it must be declared in the throws clause of this method. while((i = file.read()) != -1) 2 errors
7.3 예외 처리 7.3.1 메소드 내에서 예외를 직접 처리하는 방법 - try, catch, finally 블록 사용 예외 처리 방법 중 예외가 발생한 메소드 내에서 직접 처리하는 방법 try { ...... // try 블록 : 예외가 발생할 가능성이 있는 문장을 지정한다 } catch(예외타입1 매개변수1) { ..... // 예외 처리 블록1 : 예외의 종류에 따라 처리하는 처리 블록 ...... catch(예외타입N 매개변수N) { ...... // 예외 처리 블록 N finally { ...... // finally 블록 : 예외의 발생여부와 상관없이 무조건 수행되는 블록
7.3 예외 처리 예외 처리 - try, catch, finally 블록 사용 예 import java.io.*; class IOExceptionError { public static void main(String args[]) { try { // 예외가 발생할 가능성이 있는 문장을 try 블록으로 지정 FileReader file = new FileReader("a.txt"); int i; while((i = file.read()) != -1) { System.out.print((char)i); } file.close(); catch(Exception e) { // 발생된 예외를 처리하는 부분 System.out.println("예외 처리 루틴 : " + e + " 예외 발생");
7.3 예외 처리 예외 처리 - try, catch, finally 블록 사용 예 앞의 프로그램의 실행시 (컴파일러는 에러를 발생시키지 않는다) a.txt 파일이 없다면 프로그램은 예외 처리 루틴을 실행하여 다음과 같은 결과를 출력한다 C:\java\program>java IOExceptionError 예외 처리 루틴 : java.io.FileNotFoundException: a.txt 예외 발생 C:\java\program>
7.3 예외 처리 예제 : ExceptionError1.java 예제 : ExceptionError2.java 예제 : ExceptionSearch.java
7.3 예외 처리 7.3.2 호출 메소드에 예외를 전달하는 방법 - throws 절 사용 메소드 선언 시 다음과 같은 방법으로 지정 public void c() throws 예외클래스[, 예외클래스, ….] 예 void throws-test() throws ArithmeticException, SecurityException, NullPointerException 예제 : ExceptionTrans.java