150 likes | 371 Views
9.1 예외의 개요 9.2 예외 관련 클래스 9.3 예외 처리 9.4 예외의 인위적 발생 9.5 호출 메소드에 예외 전달 9.6 사용자 정의 예외. Chapter9 : 예외 처리. 9.1 예외의 개요. 예외 : 프로그램 실행 중에 발생하는 예기치 않은 사건 예외가 발생하는 예 정수를 0으로 나누는 경우 배열의 첨자가 음수 또는 범위를 벗어나는 경우 부적절한 형 변환이 일어나는 경우 입출력을 위한 파일이 없는 경우 등 자바 언어는 프로그램에서 예외를 처리할 수 있는 기법을 제공.
E N D
9.1 예외의 개요 • 9.2 예외 관련 클래스 • 9.3 예외 처리 • 9.4 예외의 인위적 발생 • 9.5 호출 메소드에 예외 전달 • 9.6 사용자 정의 예외 Chapter9 : 예외 처리
9.1 예외의 개요 • 예외 : 프로그램 실행 중에 발생하는 예기치 않은 사건 • 예외가 발생하는 예 • 정수를 0으로 나누는 경우 • 배열의 첨자가 음수 또는 범위를 벗어나는 경우 • 부적절한 형 변환이 일어나는 경우 • 입출력을 위한 파일이 없는 경우 등 • 자바 언어는 프로그램에서 예외를 처리할 수 있는 기법을 제공
예외의 개요 - 예외가 발생되는 예 • 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)
9.2 예외 관련 클래스 • 자바는 예외를 객체로 취급 • 예외 관련 클래스를 java.lang 패키지에서 제공 • 자바 프로그램에서는 Error, RuntimeException 클래스의 하위 클래스들을 제외한 모든 예외를 처리하여야 한다 • 일반적으로 Error, RuntimeException 클래스(하위 클래스 포함)들과 연관된 예외는 프로그램에서 처리하지 않는다 • 이유 : 예외를 처리하여 얻는 이득보다 예외를 처리하기 위한 노력이 너무 크기 때문
예외 관련 클래스 - Exception 클래스 • Exception 클래스의 하위 클래스 NoSuchMethodException 메소드가 존재하지 않을 때 ClassNotFoundException 클래스가 존재하지 않을 때 CloneNotSupportedException 객체의 복제가 지원되지 않는 상황에서의 복제 시도 IllegalAccessException 클래스에 대한 부정 접근 InstantiationException 추상클래스나 인터페이스로부터 객체 생성하려 할 때 InterruptedException 스레드가 인터럽트 되었을 때 RuntimeException 실행시간 예외가 발생할 때
예외 관련 클래스 - RuntimeException 클래스 • RuntimeException 클래스의 하위 클래스 ArithmeticException 0 으로 나누는 등의 산술적인 예외 NegativeArraySizeException배열의 크기를 지정할 때 음수의 사용 NullPointerException null 객체의 메소드나 멤버 변수에 접근할 때 IndexOutOfBoundException배열이나 스트링의 범위를 벗어난 접근.하위클래스로 ArrayIndexOutOfBoundsException클래스와 StringIndexOutOfBoundsException 클래스를 제공 SecurityException보안을 이유로 메소드를 수행할 수 없을 때
9.3 예외 처리 • Error 와 RuntimeException 클래스 관련 예외는 처리 효율보다는 처리에 드는 노력이 너무 커 자바 프로그램에서 처리하지 않고 JVM에게 처리를 맡긴다 • Error 와 RuntimeException 외에 다른 클래스들과 연관된 예외들은 자바 프로그램에서 직접 처리하여야 한다. • 예외를 처리하는 방법은 두 가지 • 예외가 발생된 메소드 내에서 처리하는 방법(try, catch 절 사용) • 예외가 발생된 메소드를 호출한 메소드에게 예외의 처리를 넘겨주는 방법(throws 절 사용)
예외 처리 - 예외의 발생 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 파일이 없을 경우에 발생하는 예외의 처리를 요구한다.
예외 처리 - 예외의 발생 • 컴파일러는 앞의 프로그램에 대해 다음과 같은 에러 메시지를 나타낸다 • 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
예외 처리 - try, catch, finally 블록 사용 • 예외 처리 방법중 예외가 발생한 메소드 내에서 직접 처리하는 방법 : try, catch, finally 블록 사용 try { ...... // try 블록 : 예외가 발생할 가능성이 있는 문장을 지정한다 } catch(예외타입1 매개변수1) { ..... // 예외 처리 블록1 : 예외의 종류에 따라 처리하는 처리 블록 } .....……. ……….. catch(예외타입N 매개변수N) { ...... // 예외 처리 블록 N } finally { ...... // finally 블록 : 예외의 발생여부와 상관없이 무조건 수행되는 블록 }
예외 처리 - 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 + " 예외 발생"); } } }
예외 처리 - try, catch, finally 블록 사용 - 예 • 앞의 프로그램의 실행시 (컴파일러는 에러를 발생시키지 않는다) • a.txt 파일이 없다면 프로그램은 예외 처리 루틴을 실행하여 • 다음과 같은 결과를 출력한다 • C:\java\program>java IOExceptionError • 예외 처리 루틴 : java.io.FileNotFoundException: a.txt 예외 발생 • C:\java\program>
9.4 예외의 인위적 발생 • 프로그램에서 인위적으로 예외를 발생시킬 수 있다 • 예외를 발생시키기 위해 throw 문 사용 throw 예외객체; 또는 throw new 예외객체타입(매개변수);
9.5 호출 메소드에 예외 전달 • 예외를 직접 처리하지 않고 자신을 호출한 메소드에게 예외를 넘겨주는 방법(throws 절 사용) • 메소드 선언시 다음과 같은 방법으로 지정 public void c() throws 예외클래스[, 예외클래스, ….] 예 void throws-test() throws ArithmeticException, SecurityException, NullPointerException
9.6 사용자 정의 예외 • 사용자는 새로운 예외를 정의하여 사용할 수 있다 • 새로운 예외는 Exception 클래스로부터 상속되어 생성되어야 한다 class UserException1 extends Exception { // 사용자 정의 예외는 Exception 클래스로부터 상속 public UserException1(String message) { // 생성자 메소드 super(message); // 상위 클래스인 Exception 클래스의 생성자를 호출하여 // 예외 객체 생성 } }