자바에서 예외처리를 하는 기본적인 방법으로는 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 {
} catch (IOException e) {
e.printStackTrace();
} finally { //이 부분의 코드가 복잡하다.... close 메소드 하나 때문에!
if (fis != null) {
try {
} 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) {
// 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
|
'IT > Java' 카테고리의 다른 글
17_자바 Objects 클래스 : 객체 비교(Comparator<T>) (0) | 2019.12.20 |
---|---|
16_자바에서 객체 복제하기 : 얕은 복제와 깊은 복제 (0) | 2019.12.17 |
14_자바 예외 : 에러(Error)와 예외(Exception), 자바 예외의 종류 (0) | 2019.12.13 |
13_중첩클래스(Nested Class) : 인스턴스 멤버 클래스, 정적 멤버 클래스, 로컬클래스(메소드 내부에 클래스 만들기) (0) | 2019.12.13 |
12_인터페이스(interface) : 인터페이스의 구성, 다중인터페이스 (0) | 2019.12.11 |