ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 예외 처리 - 사용자 정의 예외
    CSE/Java 2016. 4. 21. 11:21

    예외처리는 여러 절로 구성되어 있습니다.



    예외와 예외 클래스 & 실행 예외

    예외 처리 코드 

    자동 리소스 닫기 & 예외 넘기기(Throw)

    사용자 정의 예외





    사용자 정의 예외

     프로그램을 개발하다 보면 자바 표준 API에서 제공하는 예외 클래스만으로는 다양한 종류의 예외를 표현할 수가 없습니다.


     이와 같이 애플리케이션 서비스와 관련된 예외를 에플리케이션 예외(Application Exception)라고 합니다. 이 예외는 개발자가 직접 정의해서 만들어야 하므로 사용자 정의 예외(User Define Exception) 이라고도 합니다.



     사용자 정의 예외 클래스 선언

      사용자 정의 예외 클래스는 컴파일러가 체크하는 일반 예외로 선언할 수도, 실행 예외로 선언할 수도 있습니다. 각각의 Exception, RuntimeException을 상속해서 작성하시면 됩니다.



    1
    2
    3
    4
    public class XXXException extends [ Exception | RuntimeException ] {
        public XXXException() {}
        public XXXException(String message) { super(message); }
    }
    cs




      String 타입의 파라 미터를 갖는 생성자는 상위 클래스의 생성자를 호출하여 예외 메세지를 넘겨줍니다.


      다음은 잔고 부족 예외를 사용자 정의 클래스로 선언한 것입니다.


     * BalanceInsufficientException.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package except;
     
     
    public class BalanceInsufficientException extends Exception {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        public BalanceInsufficientException() {}
        public BalanceInsufficientException(String msg) {
            super(msg);
        }
    }
     
     
     
    cs



     

      BalanceInsufficientException은 Exception을 상속하기 때문에 컴파일러에 의해 체크되는 예외가 됩니다. 



     예외 발생시키기

      사용자 정의 예외 또는 자바 표준 예외를 코드에서 발생시키는 방법은 다음과 같습니다.


    1
    2
    throw new XXXException();
    throw new XXXException("message");
    cs



      다음 예제는 은행 계좌(account) 클래스를 작성한 것입니다. 출금(withdraw)메서드에서 잔고(balance) 플디와 출금액을 비교해서 잔고가 부족하면 BalanceInsufficientExceptioin 을 발생시키도록 했습니다.



     * Account.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    package except;
     
     
    public class Account {
        private long balance;
        
        public Account() {}
     
        public long getBalance() {
            return balance;
        }
     
        public void setBalance(long balance) {
            this.balance = balance;
        }
     
        public void deposit(int money) {
            balance += money;
        }
        
        public void withdraw(int money) throws BalanceInsufficientException {
            if (balance < money) {
                throw new BalanceInsufficientException("잔고 부족: " + (money - balance) + " 모자람");
            }
            balance -= money;
        }
    }
     
     
     
    cs






    예외 정보 얻기

     try 블록에서 예외가 발생하면 예외 객체는 catch 블록의 매개 변수에서 참조하게 되므로 매개 변수를 이용하면 예외 객체의 정보를 알 수 있습니다. 모든 예외 객체는 Exception을 상속하기 때문에 메서드를 예외 객체에서 호출 할 수 있습니다. 그 중에서도 가장 많이 사용되는 getMessage() 와 printStackTrace()가 있습니다.


     다음 예제는 Account 클래스를 이용해서 예금과 출금을 합니다. 출금할 때 withdraw() 메서드를 이용하므로 예외 처리가 꼭 필요합니다. 예외 처리 코드에서 BalanceInsufficientException 객체의 getMessage() 메서드와 printStackTrace() 메서드로 예외에 대한 정보를 얻어내고 있습니다.


     * AccountExam.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package except;
     
     
    public class AccountExam {
     
        public static void main(String[] args) {
            Account act = new Account();
            
            act.deposit(25000);
            System.out.println("예금액: " + act.getBalance());
            
            try {
                act.withdraw(50000);
            } catch (BalanceInsufficientException e) {
                String msg = e.getMessage();
                System.out.println(msg);
                System.out.println();
                e.printStackTrace();
            }
        }
     
    }
     
     
     
    cs







    end




     * 신용권의 '이것은 자바다'를 참조한 포스팅입니다.

    댓글

Designed by Tistory.