예외 예외정의예외발생예외처리예외전파 단정 단정의선언 단정조건검사옵션 kkman@sangji.ac.kr 2
예외 (exception) 실행시간에발생하는에러 (run-time error) 프로그램의비정상적인종료잘못된실행결과 예외처리 (exception handling) 기대되지않은상황에대해예외를발생야기된예외를적절히처리 (exception handler) kkman@sangji.ac.kr 3
단정 (assertion) 프로그램이올바르게실행되는데필요한조건을선언할수있는언어기능 예외처리를언어시스템에서제공 PL/I 예외처리 Ada C++ 응용프로그램의신뢰성 (reliability) 을높임. 예외검사와처리를위한프로그램코드를소스에깔끔하게삽입 kkman@sangji.ac.kr 4
예외도하나의객체로취급 예외를위한클래스를정의. 예외클래스 모든예외는형 (type) 이 Throwable 클래스또는그의서브클래스들중에하나로부터확장된클래스의객체 일반적으로프로그래머는 Throwable 의서브클래스인 Exception 을확장하여새로운예외클래스를만들어사용 class UserErr extends Exception { class UserClass { UserErr x = new UserErr(); //... if (val < 1) throw x; kkman@sangji.ac.kr 5
예외에관련된메시지를스트링형태로예외객체에담아전달 class UserErr extends Exception { UserErr(String s) { super(s); // constructor class UserClass { //... if (val < 1) throw new UserErr("user exception throw message"); 예외처리기에서, System.out.println(x.getMessage()); kkman@sangji.ac.kr 6
User-defined exception System-defined exception Throwable 클래스에는예외가일어난상황을설명하는메시지들을포함하고있다. kkman@sangji.ac.kr 7
예외의종류 System-defined exception(predefined exception) Error 클래스, RuntimeException 클래스 Programmer-defined exception Error 클래스 정상적인응용프로그램에서는수용할수없는심각한에러 Exception 클래스 정상적인응용프로그램의실행에서발생가능한예외를의미프로그래머에의해처리가능 kkman@sangji.ac.kr 8
시스템정의예외 (system-defined exception) 프로그램의부당한실행으로인하여시스템에의해묵시적으로발생하는예외 Error 와 RuntimeException 클래스로부터확장된예외 더이상프로그램의실행을지속할수없을때자바시스템에의해자동적으로생성 야기된예외에대한예외처리기의유무를컴파일러가검사하지않음, unchecked exception 시스템예외의종류 ArithmeticException, IndexOutOfBoundsException, NegativeArraySizeException, kkman@sangji.ac.kr 9
IndexOutOfBoundsException : 배열, 스트링, 벡터등과같이인덱스를사용하는객체에서인덱스의범위가벗어날때발생 ArrayStoreException : 배열의원소에잘못된형의객체를배정하였을때발생 NegativeArraySizeException : 배열의크기를음수로지정하였을때발생 NullPointerException : null 을사용하여객체를참조할때발생 SecurityException : 보안을위반했을때보안관리자 (security manager) 에의해발생 Applet 또는 RMI IllegalMonitorStateException : 모니터 (monitor) 의소유자가아닌스레드가 wait 또는 notify 메소드를호출했을때발생 kkman@sangji.ac.kr 10
프로그래머정의예외 프로그래머가필요에의해정의 Exception 클래스의서브클래스 프로그래머에의해의도적으로발생 발생한예외에대한예외처리기가존재하는지컴파일러에의해검사, 예외처리기가없으면에러 checked exception class UserException extends Exception { kkman@sangji.ac.kr 11
프로그래머정의예외의예제프로그램 [UserDefinedException.java] class UserErr extends Exception { UserErr(String s) { super(s); // constructor class UserDefinedException { public static void tryexception (int val) throws UserErr { if (val < 1) throw new UserErr("user exception throw message"); public static void main(string[] args) { try { System.out.println("try user exception..."); tryexception(0); catch(usererr e) { System.out.println( e.getmessage() ) ; 실행결과 : try user exception... user exception throw message kkman@sangji.ac.kr 12
예외발생 시스템정의예외시스템에의해묵시적으로발생프로그래머정의예외프로그래머가명시적으로발생 throw 구문 시스템정의예외나프로그래머정의예외를명시적으로발생시키는구문 구문형태 : throw ThrowableObject; kkman@sangji.ac.kr 13
throw 를이용한예외발생예 [ 예제 9.3 - ThrowStatement.java] public class ThrowStatement extends Exception { public static void exp(int ptr) { if (ptr == 0) throw new NullPointerException(); public static void main(string[] args) { int i = 0; ThrowStatement.exp(i); 실행결과 : java.lang.nullpointerexception at ThrowStatement.exp(ThrowStatement.java:4) at ThrowStatement.main(ThrowStatement.java:8) kkman@sangji.ac.kr 14
throws 절 프로그래머정의예외가발생하는경우, 예외처리기를갖고있지않으면메소드선언부분에명시한다. 선언형태 : modifiers_and_returntype methodname(params) throws e 1,...,e k { 명시해주는이유는메소드가정상적인복귀외에예외에의해복귀할수있다는것을알려주는것이다. 시스템정의예외는명시해주지않는다. kkman@sangji.ac.kr 15
try-catch-finally 구문 예외를검사하고처리해주는문장 구문형태 : try { // try 블록 catch (ExceptionType1 identifier) { // catch 블록 catch (ExceptionType2 identifier) { // catch 블록 finally { // finally 블록 try 블록 : 예외검사되는블록 catch 블록 : 예외가처리되는블록 kkman@sangji.ac.kr 16
예외처리기의실행순서 1. try 블록내에서예외가검사되고또는명시적으로예외가발생하면, 2. 해당하는 catch 블록을찾아처리하고, 3. 마지막으로 finally 블록을실행한다. Default 예외처리기 시스템정의예외가발생됐는데도불구하고프로그래머가처리하지않을때처리됨 단순히에러에대한메시지를출력하고프로그램을종료하는기능 kkman@sangji.ac.kr 17
[ 예제 9.8- FinallyClause.java] public class FinallyClause { static int count = 0; public static void main(string[] args) { while (true) { try { if (++count == 1) throw new Exception(); if (count == 3) break; System.out.println(count + ") No exception"); catch (Exception e) { System.out.println(count + ") Exception thrown"); finally { System.out.println(count + ") in finally clause"); // end while System.out.println("Main program ends"); 실행결과 : 1) Exception thrown 1) in finally clause 2) No exception 2) in finally clause 3) in finally clause Main program ends kkman@sangji.ac.kr 18
호출한메소드로예외를전파 (propagation) 하여특정메소드에서모아처리 예외처리코드의분산을막을수있음 예외전파순서 예외를처리하는 catch 블록이없으면, 호출한메소드로예외를전파 예외처리기를찾을때까지의모든실행은무시 kkman@sangji.ac.kr 19
java.lang.arithmeticexception: / by zero at Propagate.orange(Propagate.java:4) at Propagate.apple(Propagate.java:7) at Propagate.main(Propagate.java:11) kkman@sangji.ac.kr 20
예외발생가능성에대한명시 시스템정의예외 예외의발생가능성을알릴필요없음 프로그래머정의예외 해당메소드에서처리하지않을경우, 예외의종류를알려야함 throws 절사용 public void methoda() throws MyException { // if (someerrcondition()) throw new MyException(); // kkman@sangji.ac.kr 21
단정프로그램이올바르게실행되는데필요한조건을선언하는프로그래밍언어의기능 단정선언방법 1. 단정조건명시 2. 단정조건명시 + 문자열정보형식 assert < 조건식 > [: < 문자열정보 >]; 단정조건참이나거짓의결과가되는조건식참 : 실행이계속됨거짓 : AssertionError 예외발생 kkman@sangji.ac.kr 22
단정의사용예 [ 예제 9.13 - AssertExample.java] public class AssertExample { static void drawbox(int x, int y, int w, int h) { assert x >= 0; assert y >= 0; assert w >= 0; assert h >= 0; // draw the box. public static void main(string[] args) { drawbox(100, 200, 10, 20); drawbox(0, -10, 5, 30); 실행결과 : Exception in thread "main" java.lang.assertionerror at AssertWithStringExample.drawBox(AssertExample.java:4) at AssertWithStringExample.main(AssertExample.java:13) kkman@sangji.ac.kr 23
문자열정보가추가된단정의사용예 [ 예제 9.13 - AssertWithStringExample.java] public class AssertWithStringExample { static void drawbox(int x, int y, int w, int h) { assert (x >= 0) : "x must be 0 or more."; assert (y >= 0) : "y must be 0 or more."; assert (w >= 0) : "w must be 0 or more."; assert (h >= 0) : "h must be 0 or more."; // draw the box. public static void main(string[] args) { drawbox(100, 200, 10, 20); drawbox(0, -10, 5, 30); 실행결과 : Exception in thread "main" java.lang.assertionerror: y must be 0 or more. at AssertWithStringExample.drawBox(AssertWithStringExample.java:4) at AssertWithStringExample.main(AssertWithStringExample.java:13) kkman@sangji.ac.kr 24
자바의기본설정 단정검사를하지않음 단정에명시된조건검사는실행속도를느리게함 단정조건검사설정 단정조건검사 <jdk_path>/bin/java -ea < 실행할클래스이름 > <jdk_path>/bin/java -enableassertions < 실행할클래스이름 > 단정조건무시 <jdk_path>/bin/java -da < 실행할클래스이름 > <jdk_path>/bin/java -disableassertions < 실행할클래스이름 > kkman@sangji.ac.kr 25
유사점 자바프로그램의신뢰성향상을위해사용 실행중에문제가생기면예외발생 차이점 단정실행에필요한조건을검사단정은자바가상기계의실행옵션에따라검사생략이가능 예외 프로그램상에서발생하는예기치않은구문들을처리 항상예외처리구문을수행 kkman@sangji.ac.kr 26