-
자바의정석 8장 예외처리, 예외던지Java/자바의정석 2023. 2. 22. 10:21반응형
package Chap08; class Ex8_13 { public static void main(String args[]) { try { install(); } catch(InstallException e) { e.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } } // main의 끝 static void install() throws InstallException { System.out.println("시작"); try { startInstall(); // 프로그램 설치에 필요한 준비를 한다. copyFiles(); // 파일들을 복사한다. } catch (SpaceException2 e) { System.out.println("전달받음"); InstallException ie = new InstallException("설치 중 예외발생111"); ///2 System.out.println(ie.getMessage()); ie.initCause(e); throw ie; } catch (MemoryException2 me) { InstallException ie = new InstallException("설치 중 예외발생"); ///3 ie.initCause(me); throw ie; } // finally -> 마지막에 반드시 실행시켜야 하는 코드 finally { deleteTempFiles(); // 프로그램 설치에 사용된 임시파일들을 삭제한다. } // try의 끝 } static void startInstall() throws SpaceException2, MemoryException2 { System.out.println("start메소드"); if(!enoughSpace()) { // 충분한 설치 공간이 없으면... throw new SpaceException2("설치할 공간이 부족합니다."); ///1 } if (!enoughMemory()) { // 충분한 메모리가 없으면... throw new MemoryException2("메모리가 부족합니다."); // throw new RuntimeException(new MemoryException("메모리가 부족합니다.")); } } // startInstall메서드의 끝 static void copyFiles() { /* 파일들을 복사하는 코드를 적는다. */ } static void deleteTempFiles() { System.out.println("종료"); } static boolean enoughSpace() { // 설치하는데 필요한 공간이 있는지 확인하는 코드를 적는다. return false; } static boolean enoughMemory() { // 설치하는데 필요한 메모리공간이 있는지 확인하는 코드를 적는다. return true; } } // ExceptionTest클래스의 끝 class InstallException extends Exception { InstallException(String msg) { super(msg); } } class SpaceException2 extends Exception { SpaceException2(String msg) { super(msg); System.out.println("예외 메시지 전달"); } } class MemoryException2 extends Exception { MemoryException2(String msg) { super(msg); } }
==============실행결과================
시작
start메소드
예외 메시지 전달
전달받음
설치 중 예외발생111
종료
Chap08.InstallException: 설치 중 예외발생111
at Chap08.Ex8_13.install(Ex8_13.java:21)
at Chap08.Ex8_13.main(Ex8_13.java:6)
Caused by: Chap08.SpaceException2: 설치할 공간이 부족합니다.
at Chap08.Ex8_13.startInstall(Ex8_13.java:39)
at Chap08.Ex8_13.install(Ex8_13.java:17)
... 1 more
예외 발생시키기 - throw
프로그램적으로 에러가 아님에도 코드의 로직상 개발자가 고의로 에러를 발생시켜 로그에 기록하고 싶은 경우가 올 수 있다. 이때 자바에서는 throw 키워드를 사용하여 강제로 예외를 발생시킬 수 있다.
기존의 경우는 프로그램이 자동적으로 에러를 인지하고 처리하였지만, 이런 경우에는 개발자가 고의로 throw를 사용하여 에러를 발생시키고, 이 에러를 다시 catch한다고 생각하면된다.
이런경우에 new 생성자로 예외 클래스를 초기화하여 던지는데, 이 예외 클래스 생성자에 원하는 입력값을 주게되면, catch문의 getMessage() 메서드에서 지정한 값을 출력할 메세지로 지정이 가능하다.
예외 떠넘기기 (throws)
평균적으로 예외가 발생할 가능성이 있는곳에 try-catch를 사용하여 예외를 처리하지만, 경우에 따라서 다른 곳에 예외를 몰아넣어 한번에 처리하거나 혹은 특정 예외를 처리하도록 호출한 곳으로 예외를 떠넘길 수도 있다.
이런경우 사용하는 키워드가 throws이다. throws 는 메서드 선언부 끝에 작성하며 메서드에서 예외를 직접 처리(catch)하지 않은 예외를 호출한 곳으로 넘겨버리는 기능을 한다.
Point
예외를 발생시키는 경우 throw를 사용 , 예외를 메서드에 선언하는 경우 throws를 사용.
이제 코드를 다시 본다면
static void startInstall() throws SpaceException2, MemoryException2 { System.out.println("start메소드"); if(!enoughSpace()) { // 충분한 설치 공간이 없으면... throw new SpaceException2("설치할 공간이 부족합니다."); ///1 } if (!enoughMemory()) { // 충분한 메모리가 없으면... throw new MemoryException2("메모리가 부족합니다."); // throw new RuntimeException(new MemoryException("메모리가 부족합니다.")); } } // startInstall메서드의 끝
main의 try문에서 실행된 install() -> startInstall()메서드가 실행된다.
startinstall()메서드에서는 enoughSpace()와 enoughMemoery()메서드를 호출하며
static boolean enoughSpace() { // 설치하는데 필요한 공간이 있는지 확인하는 코드를 적는다. return false; } static boolean enoughMemory() { // 설치하는데 필요한 메모리공간이 있는지 확인하는 코드를 적는다. return true; }
해당코드는 이와같다. enoughSpace는 false를 반환
if(!enoughSpace()) { // 충분한 설치 공간이 없으면... throw new SpaceException2("설치할 공간이 부족합니다."); ///1 }
해당 코드가 실행되며 여기서 SpaceException2라는 예외를 생성하여 고의로 예외를 발생시킨다.
static void startInstall() throws SpaceException2, MemoryException2
고의로 발생시킨 예외를 처리하기위해 throws SpaceException2를 사용하였고
class SpaceException2 extends Exception { SpaceException2(String msg) { super(msg); System.out.println("예외 메시지 전달"); } }
super(msg)에서 설치할공간이 부족합니다. 라는 메시지를 전달받고.
static void install() throws InstallException { System.out.println("시작"); try { startInstall(); // 프로그램 설치에 필요한 준비를 한다. copyFiles(); // 파일들을 복사한다. } catch (SpaceException2 e) { System.out.println("전달받음"); InstallException ie = new InstallException("설치 중 예외발생111"); ///2 System.out.println(ie.getMessage()); ie.initCause(e); throw ie; } catch (MemoryException2 me) { InstallException ie = new InstallException("설치 중 예외발생"); ///3 ie.initCause(me); throw ie; } // finally -> 마지막에 반드시 실행시켜야 하는 코드 finally { deleteTempFiles(); // 프로그램 설치에 사용된 임시파일들을 삭제한다. } // try의 끝 }
catch (SpaceException2 e) {
해당 예외를 처리할수있는 catch문으로 이동
InstallException ie = new InstallException("설치 중 예외발생111"); ///2
해당 예외를 다시 초기화하고 '설치 중 예외발생111' 이라는 메시지를 입력받고
이 해당 메시지를 getMessage()메서드를 통해 호출한다.
그리고 참조변수를 통해 initCause(e) 예외의 원인으로 설정한뒤
다시 throw ie를 사용하여 예외를 던지지만
} catch (MemoryException2 me) { InstallException ie = new InstallException("설치 중 예외발생"); ///3 ie.initCause(me); throw ie; }
다음 catch 블럭에서는 타입이 일치하지않아 catch문이 실행되지않는다.
// finally -> 마지막에 반드시 실행시켜야 하는 코드 finally { deleteTempFiles(); // 프로그램 설치에 사용된 임시파일들을 삭제한다. } // try의 끝
static void deleteTempFiles() { System.out.println("종료"); }
그리곤 finally를 사용하여 deleteTempFiles메서드를 호출하며 해당 코드가 모두 종료된다.
반응형'Java > 자바의정석' 카테고리의 다른 글
자바 hashCode(), identityHashCode() (0) 2023.02.22 자바 equals()는 대체 왜 쓰는가...? (0) 2023.02.22 자바의정석 Exception 예외처리, printStackTrace() (Ex8~ (0) 2023.02.21 JAVA Exception 예외처리 간단 명료 정리!! (0) 2023.02.21 자바의정석 Ex7_11 인터페이스 (0) 2023.02.21