310 likes | 435 Views
예외 처리. 에외상황 ( Exception). 정의 프로그램을 실행하는 동안에 오류가 발생하여 더 이상 프로그램을 진행할 수 없는 상황이 발생될 때를 예외상황 이라 함 Exception Handling 예외상황이 발생하면 프로그램이 종료될 것이 아니라 적절한 조치를 취하여 프로그램이 계속 실행 될 수 있도록 함. 에외상황 ( Exception). Error 와 Exception 의 차이 - Error 심각한 에러로 복구가 불가능 , 프로그램 중단 - Exception
E N D
에외상황(Exception) • 정의 • 프로그램을 실행하는 동안에 오류가 발생하여 더 이상 프로그램을 진행할 수 없는 상황이 발생될 때를 예외상황 이라 함 • Exception Handling • 예외상황이 발생하면 프로그램이 종료될 것이 아니라 적절한 조치를 취하여 프로그램이 계속 실행 될 수 있도록 함.
에외상황(Exception) • Error와 Exception의 차이 • - Error • 심각한 에러로 복구가 불가능, 프로그램 중단 • - Exception • 경미한 문제로 복구 가능, 계속 프로그램 실행
자바에서의 예외 처리 필요성 • 자바 프로그램은 인터넷/인트라넷과 연계하여 수행 가능함 : 많은 예외 상황 존재 • 물리적/논리적 거리(distance) • 보안(security) • 위치(location) • 접근(access)
예외 처리 사용 시기 • 안정적이고 오류에 강한 프로그램을 만들려고 할 경우에는 언제든 사용 • 예외 사항이 사용되는 전형적인 경우 • 파일 open • 파일이 존재하지 않을 경우 • 파일의 허가 권한이 적합하지 않은 경우
예외 처리 사용 시기의 예(계속) • 변수 사용시 • 정의 안된 변수 사용 • 변수 선언의 scope가 부적절 • 산술 연산시 • 산술 연사의 결과가 부정 / 불능 • URL 사용시 • URL의 형식이 잘못된 경우 • 질의어 사용시 • 질의어의 내용이 잘못된 경우 • 기타 여러 상황
예외 범주 java.lang.Object java.lang.Throwable java.lang.Error java.lang.Exception java.lang.RuntimeException
Error 클래스 • 프로그램에서 발생하는 치명적인 문제 정의 • Out of Memory • Exception 클래스 • 모든 예외 클래스의 상위 클래스 • RuntimeExecption 클래스 • 프로그램 수행 중에 예외상황이 생기면 발생 • 예) • 배열을 사용하는 프로그램에서 배열의 첨자가 해당되는 배열의 범위를 벗어나면 에러가 발생
자바 예외의 예 • ArthimeticException - 0으로 나누고자 하는 경우에 발생 int j=3; j = j/0; • NullPointerExecption • Object를 실체화 하지 않고 사용(new 관련) • Image im[] = new Image[4]; • g.drawImage(im[0], x, y, this); • Image항목에 대한 실체화 누락 • ArrayIndexOutOf BoundsException • 배열의 실제크기보다 더 큰 항목 참조
ClassCastExecption • 클래스를 불가능한 타입으로 변환시킬 때 발생 • 하나의 객체를 관련이 없는 다른 객체로 변환하고자 하는 경우에 발생 Object obj = new Object(); String str = (String) obj; • IOException • 파일 입출력시 실제로 파일이 없거나 네트워크 I/O시에 발생 • NegativeArraySizeException • 음수 크기의 배열을 생성하고자 하는 경우 발생 int a[] = new int[-1]; • MalFormedURLException • URL 을 사용할 때 URL의 형식이 잘못된 경우
Exception Handling try { ... statementMaybeOccurException; ... } catch (ExceptionType1 e) { ... } catch (ExceptionType2 e) { … } finally { ... } • 예제 프로그램 • ArrayIndexOutOfBoundsException발생 • 불행히도 프로그램이 중단 • 예외 처리 • 이 프로그램을 계속 실행하도록 처리해야 함 • try … catch … finally 이용
예외 처리 • Try 예약어 • 예외가 발생될 가능성이 있는 코드를 try 블록 안에 기술 • try 블럭은 보호된 코드 블록이 됨 • Catch예약어 • Catch블럭 • 예외가 발생되었을 경우 해당하는 예외를 잡아내어 프로그램의 흐름을 복구할 것인지 종료를 할 것인지를 결정하는 프로그램을 기술하는 장소 • catch (EceptionClassName exceptionVar) { … } • 하나의 try문에 여러 개의 catch문을 이용 • 예외가 발생시 catch문을 순서적으로 체크
Finally예약어 • 예외의 발생과 관계없이 항상 수행되는 코드를 기술
오류의 계층화(그룹화) Exception • 관련 있는 오류의 계층 구성 • catch (InvalidIndexException e) { … } • catch (ArrayException e) { … } • catch (Exception e) { … } • 일반적인 Exception이 발생하면 동작 • 되도록이면 구체적인 예외사항에 대하여 복구 처리를 하도록 ArrayException InvalidIndexException NoSuchElementException ElementTypeException
중첩된 method에서의 예외처리 • 다음과 같은 중첩 Method call에서 method1 { call method2; } method2 { call method3; } method3 { call readFile }
중첩된 method에서의 예외처리 • 위의 문장은 다음과 같이 처리 method1 { try { call method2; } catch (exception) { doErrorProcessing; } } method2 throws exception { call mehod3; } method3 throws exception { call readFile; }
사용자 정의 예외 • 상위 클래스인 Exception 클래스를 상속받아서 생성 • 또 하나의 클래스(타입) 생성 • 특정한 상황에서 사용자 정의 예외를 사용하려면 • 사용자 정의 예외의 인스턴스를 throw예약어를 이용하여 발생시킴
Exception 생성 • 예외처리에 대한 class를 생성 public class ExcepionClassName extends Exception { … } • 예외 처리를 발생 시키려면 • 예외처리를 발생하는 method 선언부에 다음을 추가 • methodName throws ExcepionClassName {…};. • 예외발생시 • throw new ExcepionClassName();
Exception 생성 • 예제 • class Person에서 성을 지정하는 경우, 현재 이용할 수 없는 성인 경우에 예외를 발생시키는 예외처리 InvalidLastNameException 정의 • class InvalidLastNameException extends Exception {...} • class Person에서 method setLastName()에서 예외처리 InvalidLastNameException을 발생 void setLastName(String name) throws InvalidLastNameException { if (!IsLastName(name)) throw new InvalidLastNameException(); lastName = name; };
Exception 생성 테스트 class InvalidLastNameException extends Exception { } class Person { public static final String[] sLAST = {"이", "박", "노", "강", "김"}; String lastName; String Name; void setLastName(String name) throws InvalidLastNameException { if (!IsLastName(name)) throw new InvalidLastNameException(); lastName = name; }; private boolean IsLastName(String name) { for (int i=0; i<sLAST.length; i++) { if (sLAST[i].equals(name)) return true; } return false; } }
Exception 생성 테스트 class ExceptionTest { public static void main(String args[]) { Person a, b, c; a = new Person(); try { a.setLastName("영"); } catch (InvalidLastNameException e) { System.out.println("\n에외처리 시작"); System.out.println("에러가 발생한 이유는 " + e.toString()); System.out.println("에외처리 끝\n"); } finally { System.out.println("이곳은 항상 실행되는 부분입니다."); } System.out.println("a의 성은 " + a.lastName + "입니다."); } }
예외처리 활용예제 // java.lang 패키지는 디폴트 패키지 이므로 import 하지 않아도 됨 import java.lang.*; public class UserExceptionFlow { public static void main (String args[]) { UserExceptionFlow uef = new UserExceptionFlow(); try { uef.ExceptionThrowMtd1(); } catch(MyNewException1 e1) {
System.out.println(e1); } catch(Exception e2) { e2.printStackTrace(); } finally { System.out.println ("Always Printed."); } } // main() public void ExceptionThrowMtd1() throws MyNewException1 { ExceptionThrowMtd2(); }
public void ExceptionThrowMtd2() throws MyNewException1 { ExceptionThrowMtd3(); } public void ExceptionThrowMtd3() throws MyNewException1 { throw new MyNewException1("MyNewException1 발생"); } }