본문 바로가기

IT/Java

15_자바 예외 처리 : try-with-resources, 사용자 정의 예외 클래스

자바에서 예외처리를 하는 기본적인 방법으로는 try-catch구문 활용하기와 예외 던지기가 있다.

그런 기본적인 것 말고, 조금 특이한 것들에 대해 적어보려고 한다.

 

01. try-with-resources

try-with-resources는 자바 7에서 새로 추가된 기능이다.

try블록이 정상적으로 실행을 완료했든 도중에 예외가 발생했든 자동으로 close() 메소드를 호출하여 리소스를 안전하게 닫아준다.

try-with-resources를 사용하기 위해서는 AutoCloseable 인터페이스를 구현하고 있어야 한다.

 

 

try-with-resources를 사용하지 않은 코드이다.

close() 메소드 하나를 호출하기 위해 finally 구문 안에 또 try-catch 구문이 중첩되어 코드가 매우 복잡해보인다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class FileInputStreamBefore {
    public static void main(String[] args) {
 
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("file.txt");
 
        } catch (IOException e) {
            e.printStackTrace();
        } finally {    //이 부분의 코드가 복잡하다.... close 메소드 하나 때문에!
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
 
                }
            }
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

try-with-resources를 사용하게 되면 아래처럼 코드가 훨씬 깔끔해진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class FileInputStream implements AutoCloseable {
    private String file;
    
    public FileInputStream(String file) {
        this.file = file;
    }
    
    public void read() {
        System.out.println("reading " + file);
    }
    
    @Override
    public void close() throws Exception {
 
        System.out.println("closing " + file);    
}
 
 
}    //end class
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

아래의 코드까지 작성 후 실행해 본다.

메인에서 close() 메소드를 직접 호출하는 부분은 없으며, 파일을 읽어들이는 read() 메소드만 호출하고 있다.

 

처음에는 아래 코드 그대로, 나중에는 #5의 주석을 풀고 실행해본다.

예외가 발생하든, 정상종료되든 close() 메소드가 자동으로 실행되는 것을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
public class TryWithResourceExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("file.txt")){
            fis.read();
//            throw new Exception();    //강제로 예외 발생 시킴 - 주석처리 하든, 안 하든 close 메소드 실행됨
        } catch(Exception e) {
            System.out.println("예외 처리 코드가 실행되었습니다.");
        }
    }
 
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

02. 사용자 정의 예외 클래스

자바에서 주어지는 예외 말고도, 개발자가 자신의 프로그램에 적절한 예외를 클래스로 만들어 사용할 수 있다.

사용자 정의 예외 클래스는 Exception(일반예외) 클래스를 상속해야 한다.

 

 

사용자정의예외 클래스이다.

1
2
3
4
5
6
7
8
9
public class BalanceInsufficientException extends Exception{
 
    private static final long serialVersionUID = 1L;
    public BalanceInsufficientException() {}    //기본생성자
    public BalanceInsufficientException(String message) {    //사용자정의 생성자
        super(message);
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

Account 클래스이다. 인출할 때 잔고가 부족하면 사용자 예외를 던지도록 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Account {
    private long balance;
    
    public Account() {}
    
    public long getBalance() {
        return 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;
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter