세로형
Recent Posts
Recent Comments
Link
11-25 00:03
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

꿈 많은 사람의 이야기

자바 예외 처리(try catch), throws, throw, 사용자 정의 예외 클래스 본문

java

자바 예외 처리(try catch), throws, throw, 사용자 정의 예외 클래스

이수진의 블로그 2017. 8. 17. 08:57
반응형
728x170

자바는 예외를 떠넘기는(throws)그리고 예외를 발생시키는 throw가 존재한다.

throws는 메소드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try-catch 블록으로 처리하는 것이 기본이지만 경우에 따라서는 메소드를 호출한 곳으로 예외를 떠넘길 경우 사용한다.
throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않는 예외를 호출한 곳으로 떠넘기는 역할을 한다.

그리고 throws 키워드가 붙은 메소드를 호출할 때는 반드시 try-catch로 묶어 try 블록 내에서 호출 되어야 한다. 그리고 catch 블록에서 떠넘겨 받은 예외를 처리해야 한다. 다음 소스를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void method1()
{
    try{
        method2();
    }
    catch(ClassNotFoundException e)
    {
        System.out.println("클래스가 존재하지 않습니다.");
    }
}
    
public void method2() throws ClassNotFoundException{
    Class cla = Class.forName("java.lang.aaaa");
}
Colored by Color Scripter

method2()는 ClassNotFoundException 클래스로 throws 떠넘기고 있다. 이 메소드를 호출하는 method1()은 try-catch문으로 해당 메소드를 호출한다. 그리고 method2()는 ClassNotFoundException에 떠넘기고 있기 때문에 catch문에 ClassNotFoundException을 선언한다. 아니면 최상위 클래스 Exception 으로 떠넘겨도 된다.

프로그램을 개발하다 보면 자바에서 제공해주는 예외 클래스만으로는 부족한 경우가 있다. 필요한 예외는 사용자가 직접 정의할 수 있는데 이런것을 사용자 정의 예외라고도 한다.

사용자 정의 예외는 컴파일러가 체크하는 일반 예외냐 아니면 컴파일러가 체크하지 않는 실행 예외냐 2개로 선언할 수 있다.
일반 예외로 선언할 경우 Exception을 상속하면 되고, 실행 예외로 선언할 경우에는 RuntimeException을 상속하면 된다.

해당 사용자 예외 클래스는 일반적으로 2개의 생성자를 만든다. 하나는 매개 변수가 없는 기본 생성자이고 다른 하나는 예외 발생 메세지(예외 메세지)를 전달하기 위해 String 타입의 매개 변수를 갖는 생성자이다.

1
2
3
4
5
6
7
class Balance extends Exception{
    public Balance(){}
    public Balance(String mes)
    {
        super(mes);
    }
}
Colored by Color Scripter

위 Balance 클래스는 사용자 정의 예외 처리 클래스이다. Exception클래스를 상속한 것으로 보아 일반 예외이다. 또한, 2개의 생성자를 생성했다. super( ); 를 이용해 부모에게 메세지를 전달하는 기능을 담당한다.

또한 예외를 발생시킬 수 있는데 throw를 이용해 예외를 발생 시킬 수 있다. 예를 들어 throw new ~과 같이 떠넘긴다.
(왠만하면 클래스 이름을 ~Exception 로 하면 보기 좋다)
예외 발생 코드를 가지고 있는 메소드는 내부에서 try-catch블록으로 예외를 처리할 수 있지만, 대부분은 자신을 호출한 곳에서 예외를 처리하도록 throws키워드로 예외를 떠넘긴다.

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
public class ThrowsEx {
    static int balance = 300;
 
    public static void main(String[] args) {
        try
        {
            withdraw(500);
        }
        catch(Balance e)
        {
            System.out.println(e.getMessage());
            e.printStackTrace();
            
        }
        
 
    }
    
    public static void withdraw(int money) throws Balance{
        if(balance < money)
        {
            throw new Balance("잔고부족");
        }
    }
    
}
 
Colored by Color Scripter

위 소스를 보면 withdraw는 예외를 throws 떠넘긴다. 
(Balance클래스에 지금 이 소스에선 Balance인데 BalanceException과 같이 이름을 지어주면 더 좋다.) 아무튼 만약 예외가 발생되는 즉, 잔액보다 출금하는 금액이 커버리면 예외를 발생시킨다. 

main에서 이 withdraw( )를 호출하는데 withdraw에서 예외가 발생되면 일단 떠넘겨지니까 catch문으로 온다. 그리고 catch에선 Balance 예외 클래스로 떠넘긴다. 
이때 withdraw에서 넘겨와진 "잔고부족"이 메세지로 넘어가서 출력이 되게 된다.

정리하면 withdraw는 throws 즉 예외를 떠넘기므로 이 메소드를 호출하려면 try-catch문으로 감싸서 호출해야 한다.(위 소스에선 main안에)
그리고 throws로 넘기는 클래스가 Balance인데 이것은 사용자 정의 클래스이다. 따라서 catch문에 해당 Balance로 보낸다. 그리고 throw로 보낸 메세지를 받게 되고 출력이 된다.

이런식으로 예외를 떠넘기고 만들고 하며 프로그램을 실행시킨다.



반응형
그리드형
Comments