[INA470] Java Programming Youn-Hee Han http://link.kut.ac.kr 15. 예외처리 [INA470] Java Programming Youn-Hee Han http://link.kut.ac.kr
1. 예외 처리란? 예외(Exception) 예외 처리 잘못된 코드, 부정확한 데이터, 예외적인 상황에 의하여 발생하는 오류 예외가 발생하는 예 0으로 나누는 것과 같은 잘못된 연산 배열의 인덱스가 한계를 넘는 경우 디스크 및 네트워크에서 발생하는 하드웨어적 에러 예외 처리 C나 C++에서는 대부분의 경우 오류가 발생하면 프로그램이 종료된다. 하지만, 무조건 종료하는 것보다는 프로그램 내에서 오류를 감지하여 각 오류에 대한 처리를 내부적으로 수행할 수 있다. 이렇게 오류를 감지하여 그것에 대한 처리를 하는 것을 예외 처리라고 한다.
1. 예외 처리란? 예외(Exception) 객체와 throw/catch Exception Object throw catch 이 예외 객체는 오류의 정보, 오류의 타입, 오류 발생과 관련된 상태 정보 throw 예외 객체를 생성하여 던지는 것 catch 던져진 객체를 잡아서 처리하는 것
1. 예외 처리란? 예외 발생 예 위 예에서는 ArithmeticException 객체가 던져지긴(throw) 하였으나 잡는(Catch) 코드가 별도로 없기 때문에 프로그램이 강제로 종료됨 실행되지 않음!
2. 예외 처리기의 개요 try/catch 블록 try 블록 catch 블록 기본 형식 예외가 발생되어 던져질 수 있는 블록 던져진 예외를 잡아서 처리하는 블록 기본 형식 try { … // 예외가 발생할 수 있는 코드 } catch (예외클래스 참조변수) { // 예외를 처리하는 코드 }
2. 예외 처리기의 개요 try/catch 블록에서의 실행 흐름 try/catch 블록의 특징
2. 예외 처리기의 개요 try/catch 블록 예제 1 public class DivideByZeroOK { DivideByZeroOK.java public class DivideByZeroOK { public static void main(String[] args) { int x = 1; int y = 0; try { int result = x / y; // 예외 발생! } catch (ArithmeticException e) { System.out.println("0으로 나눌 수 없습니다."); } System.out.println("프로그램은 계속 진행됩니다.");
2. 예외 처리기의 개요 try/catch 블록 예제 2 import java.util.*; InputError.java import java.util.*; public class InputError { static Scanner scan = new Scanner(System.in); public static void main(String[] args) { int i = 0; System.out.print("정수를 입력하시오: "); try { i = scan.nextInt(); System.out.println("입력받은 정수의 값: " + i); } catch (InputMismatchException e) { System.out.println("정수가 아닙니다. "); }
2. 예외 처리기의 개요 예외 발생 차단 try/catch가 아무리 유용할지라도 만약 정상적인 코딩으로 예외가 발생할 수 있는 상황을 차단할 수 있다면 그렇게 하는 것이 더 좋은 프로그래밍 방법이다. 예제 1에서 분모가 0인지 미리 검사 예제 2에서 정수가 입력되었는지 검사하는 코드 삽입 If (y != 0) int result = x / y; import java.util.*; public class InputError { static Scanner scan = new Scanner(System.in); public static void main(String[] args) { int i = 0; System.out.print("정수를 입력하시오: "); if (scan.hasNextInt() ) i = scan.nextInt(); else System.out.println("정수가 아닙니다. "); }
2. 예외 처리기의 개요 finally 블록 오류가 발생하였건 발생하지 않았건 항상 실행되어야 하는 코드는 finally 블록에 넣을 수 있다. 예 TV를 켜고 TV 시청에 성공했든 안했든 TV는 다시 꺼야 한다. 즉, finally블록은 뒷처리를 위한 용도로 쓰일 수 있다.
3. 예외의 종류 예외 관련 클래스들의 계층도 모든 예외는 Throwable 로부터 상속되어 Exception과 Error 클래스로 나뉘어서 분류된다.
3. 예외의 종류 Exception 및 Error 의 차이 : 시스템에서 발생하는 심각한 에러이다. - 치명적인 내부 오류나 자바 가상 머신에서의 자원 고갈 등과 관련 - 프로그램이 바로 종료됨 - 거의 발생되지 않는다. Throwable Exception : 프로그램의 실행 도중 흔히 발생할 수 있는 일반적 에러 1) RunTimeException : 프로세스 실행중에 발생하는 에러 2) IOException : 파일 및 네트워크 입출력시에 발생하는 에러
3. 예외의 종류 주요 예외 정리
3. 예외의 종류 Unchecked Exception과 Checked Exception 컴파일러가 해당 예외에 대해 신경쓰지 않는 예외 종류 Error 클래스 및 이 클래스의 서브 클래스들의 예외 RuntimeException 클래스 및 이 클래스의 서브 클래스들의 예외 체크 예외 (Checked Exception) 컴파일러에 의해 코딩상에서 해당 예외에 대해 처리가 정확하게 이루어졌는지 체크하는 예외 IOException 클래스 및 이 클래스의 서브 클래스들의 예외 Error Throwable Exception 1) RunTimeException 2) IOException Unchecked Exception Checked Exception
3. 예외의 종류 다형성과 예외 경우 1 경우 2 분간이 가능하긴 하다.
3. 예외의 종류 다형성과 예외 경우 3 경우 4 (중요!!!) catch 블록을 여러 개 작성할 때에는 구체적인 클래스 이름을 먼저 사용하고 일반적인 클래스 이름은 나중에 써야 한다.
4. 예외와 메소드 예외를 발생시키는 메소드 분간 및 처리법 위와 같이 checked exception 을 던지는 메소드를 호출할 때 예외 처리 방법 방법 1) try/catch 블록 사용 방법 2) 다시 예외를 상위 메소드로 전달
4. 예외와 메소드 예외를 발생시키는 메소드 정의 방법 throw 키워드 메소드 선언시에 본 메소드 몸체에서는 지정한 예외가 발생할 수 있다고 메소드 호출자에게 알리는 역할을 함 일반적으로 비체크 예외인 Error 및 RuntimeException 예외는 throws 키워드 뒤에 잘 열거하지 않는다. 체크 예외인 경우 1) throws 키워드와 함께 본 메소드에서 발생가능성이 있음을 명시적 알림 2) try/catch 블록 사용 int method(int n) throws IOExcpetion, 예외2 { … InputStream is = new InputStream(…); is.read(); }
4. 예외와 메소드 예외를 발생시키는 메소드 활용 예제 (1/4) public class Test { Test.java public class Test { public static void main(String[] args) { System.out.println(readString()); } public static String readString() { byte[] buf = new byte[100]; System.out.println("문자열을 입력하시오:"); System.in.read(buf); return new String(buf);
4. 예외와 메소드 예외를 발생시키는 메소드 활용 예제 (2/4) 1) try/catch 블록 사용 방법 Test.java import java.io.IOException; public class Test { public static void main(String[] args) { System.out.println(readString()); } public static String readString() { byte[] buf = new byte[100]; System.out.println("문자열을 입력하시오:"); try { System.in.read(buf); } catch (IOException e) { System.out.println(e.getMessage()); e.printStackTrace(); return new String(buf);
4. 예외와 메소드 예외를 발생시키는 메소드 활용 예제 (3/4) 2) 상위 메소드로 예외를 던지는 방법 - 1 Test.java import java.io.IOException; public class Test { public static void main(String[] args) { try { System.out.println(readString()); } catch (IOException e) { System.out.println(e.getMessage()); e.printStackTrace(); } public static String readString() throws IOException { byte[] buf = new byte[100]; System.out.println("문자열을 입력하시오:"); System.in.read(buf); return new String(buf);
4. 예외와 메소드 예외를 발생시키는 메소드 활용 예제 (4/4) 2) 상위 메소드로 예외를 던지는 방법 – 2 이 방법은 결국 main() 메소드까지 자신이 받은 예외를 자바 가상 머신에게 던져버리고 자바가상머신의 디폴트 예외 처리기에 그 예외에 대한 처리를 맡기는 방식임. 자바 가상 버신의 디폴트 예외 처리기는 무조건 프로그램을 강제 종료한다. Test.java import java.io.IOException; public class Test { public static void main(String[] args) throws IOException { System.out.println(readString()); } public static String readString() throws IOException { byte[] buf = new byte[100]; System.out.println("문자열을 입력하시오:"); System.in.read(buf); return new String(buf);
5. 예외 생성하기 throw 키워드 자바 코딩상에서 예외를 발생시킬 때 사용하는 키워드 주의]throws 키워드와 다르다 new IOException();
5. 예외 생성하기 throw 키워드 사용 사용자 정의 예외 프로그래머가 직접 예외 클래스를 새롭게 정의하여 이 클래스로부터 예외 객체를 만들어 사용할 수 있다. Exception 클래스 또는 그 서브클래스 중 하나를 상속받아야 한다. void allocateMemory() throws AllocateMemoryFailException { … if (memory == null) throw new AllocateMemoryFailException(); } public class MyException extends Exception { … }
5. 예외 생성하기 예외 발생 예제 ExceptionTest.java class DivideByZeroException extends ArithmeticException { public DivideByZeroException() { super("0으로 나눌수는 없음."); } public class ExceptionTest { public static void main(String[] args) { double result; try { result = quotient(1, 0); } catch (DivideByZeroException e) { System.out.println(e.toString()); public static double quotient(int n, int d) throws DivideByZeroException { if (d == 0) throw new DivideByZeroException(); return (double) n / d;
5. 예외 생성하기 여러 개의 예외 발생 및 처리 네트워크에서 데이터를 받을 때 발생할 수 있는 예외 상황 1) 네트워크 접속이 끊기거나 2) 하드 디스크가 꽉찰 수 있음 위 클래스의 saveFile() 메소드 사용법 public class NetworkFile { public void saveFile() throws NetworkException, DiskException { … } public class Test { public void process() { NetworkFile f = new NetworkFile(); try { f.saveFile(); } catch (NetworkException e) { … } catch (DiskException e) { }