객체지향프로그래밍 오류처리 손시운 ssw5176@kangwon.ac.kr
오류메시지를분석한다. 오류메시지에서많은내용을알수있다. 2
디버깅 디버거를사용하면프로그램에서쉽게오류를감지하고진단할수있다. 디버거는중단점을설정하여서프로그램의실행을제어할수있으며문장 단위로실행하거나변수의값을살펴볼수있다. 3
이클립스에서디버깅 4
이클립스에서디버깅 5
이클립스의디버깅명령어 6
예외처리 오류가발생했을때오류를사용자에게알려주고모든데이터를저장하게 한후에사용자가우아하게 (gracefully) 프로그램을종료할수있도록하는 것이바람직하다 7
예외란? 예외 (exception): 잘못된코드, 부정확한데이터, 예외적인상황에의하여발생하는오류 ( 예 ) 0으로나누는것과같은잘못된연산이나배열의인덱스가한계를넘을수도있고, 디스크에서는하드웨어에러가발생할수있다. 8
try-catch 블록 9
예외의예 public class BadIndex { public static void main(string[] args) { int[] array = new int[10]; for (int i = 0; i < 10; i++) array[i] = 0; int result = array[12]; System.out.println(" 과연이문장이실행될까요?"); 실행되지않음! 10
try-catch 블록으로예외처리 public class BadIndex2 { public static void main(string[] args) { int[] array = new int[10]; for (int i = 0; i < 10; i++) array[i] = 0; try { int result = array[12]; catch (ArrayIndexOutOfBoundsException e) { System.out.println(" 배열의인덱스가잘못되었습니다."); System.out.println(" 과연이문장이실행될까요?"); 11
try/catch 블록에서의실행흐름 12
finally 블록 13
try-with-resources 문장 try-with-resources 문장은문장의끝에서리소스들이자동으로닫혀지게한 다. try-with-resources 문장은 Java SE 7 버전부터추가되었다. 14
예제 ArrayList<String> list = new ArrayList<String>(); list.add( item1 ); list.add( item2 ); list.add( item3 ); try (PrintWriter output = new PrintWriter("myoutput.txt")) { for (String s : list) { output.println(s.tolowercase()); 15
예외의종류 16
예외의종류 unchecked exception checked exception 17
다형성과예외 다형성의원칙에따라상위클래스의참조변수는하위클래스의객체를참 조할수있다. 특히이것은 catch 블록에서예외를잡을때유용하다. 18
다형성과예외 try { getinput();// 예외를발생하는메소드 catch(numberexception e) { // NumberException의하위클래스를모두잡을수있다. try { getinput(); catch(exception e) { //Exception의모든하위클래스를잡을수있으나분간할수없다.! 19
다형성과예외 try { getinput(); catch(toosmallexception e) { //TooSmallException 만잡힌다. catch(numberexception e) { //TooSmallException 을제외한나머지예외들이잡힌다. try { getinput(); catch(numberexception e) { // 모든 NumberException 이잡힌다. catch(toosmallexception e) { // 아무것도잡히지않는다! 20
예외와메소드 throws 를사용하여, 다른메소드한테예외처리를맡길수있다. 21
예제 public void writelist() throws IOException { PrintWriter = new PrintWriter(new FileWriter("outfile.txt")); for (int i = 0; i < SIZE; i++) out.println(" 배열원소 " + i + " = " + list[i]); out.close(); 22
에외를처리하는절차 어떤메소드안에서예외가발생하면런타임시스템은그메소드안에예외 처리기가있는지를살핀다. 만약그자리에예외처리기가없다면호출스 택 (call stack) 에있는상위메소드를조사하게된다. 23
LAB: 예외처리하기 다음코드의예외를처리하여보자. 1. public class Test { 2. public static void main(string[] args) { 3. System.out.println(readString()); 4. 5. 6. public static String readstring() { 7. byte[] buf = new byte[100]; 8. System.out.println(" 문자열을입력하시오 :"); 9. System.in.read(buf); 10. return new String(buf); 11. 12. Exception in thread "main" java.lang.error: Unresolved compilation problem: Unhandled exception type IOException at Test.readString(Test.java:9) at Test.main(Test.java:3) 24
SOLUTION 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); 25
에외생성하기 26
예외는 throw 문장으로생성된다. 어떤메소드도 throw 문장을사용하여서예외를생성할수있다. throw 문장은하나의인수만을요구하는데바로 Throwable 객체이다. Throwable 객체는 Throwable 클래스를상속받는자식클래스들의인스턴스 27
예제 public Object pop() { Object obj; if (size == 0) { throw new EmptyStackException();... return obj; 28
예외처리의장점 오류처리코드를정상적인코드와분리할수있다. 동일한코드를예외처리를사용하지않는경우와예외처리를사용하는경 우로분리하여비교해보자. 29
예외처리를사용하지않는경우 errorcodetype readfile() { int errorcode = 0; 파일을오픈한다 ; if (thefileisopen) { 파일의크기를결정한다 ; if (gotthefilelength) { 메모리를할당한다 ; if (gotenoughmemory) { 파일을메모리로읽는다 ; if (readfailed) { else { else {... errorcode = -1; errorcode = -2; errorcode = -3; 30
예외처리를사용하는경우 void readfile() { try { 파일을오픈한다 ; 파일의크기를결정한다 ; 메모리를할당한다 ; 파일을메모리로읽는다 ; 파일을닫는다 ; catch (fileopenfailed) {... catch (sizedeterminationfailed) {... catch (memoryallocationfailed) {... catch (readfailed) {... catch (fileclosefailed) {... 31
LAB: 예외처리하기 다음코드의예외를처리하여보자. public class ExceptionTest3 { public static void main(string args[]) { int num = Integer.parseInt("XYZ"); System.out.println(num); Exception in thread "main" java.lang.numberformatexception: For input string: "XYZ" at java.lang.numberformatexception.forinputstring(unknown Source) at java.lang.integer.parseint(unknown Source) at java.lang.integer.parseint(unknown Source) at numberformat.exceptiontest3.main(exceptiontest3.java:6) 32
SOLUTION public class ExceptionTest3 { public static void main(string args[]) { try { int num = Integer.parseInt("ABC"); System.out.println(num); catch (NumberFormatException e) { System.out.println("NumberFormat 예외발생 "); 33
단언 단언 (assertions) 은프로그래머가현재시점에서믿고있는내용을다시한 번확인할때사용된다. 단언 34
단언의형식 35
예제 import java.util.scanner; public class AssertionTest { public static void main(string argv[]) { Scanner input = new Scanner(System.in); System.out.print(" 날짜를입력하시오 : "); int date = input.nextint(); // 날짜가 1 이상이고 31 이하인지를검증한다. assert(date >= 1 && date <= 31) : " 잘못된날짜 : " + date; System.out.printf(" 입력된날짜는 %d 입니다.\n", date); 날짜를입력하시오 : 999 Exception in thread main java.lang.assertionerror: 잘못된날짜 : 999 at AssertionTest.main(AssertionTest.java:8) 36