오류(Error): 시스템이 종료되어야 할 수준의 상황과 같이 수습할 수 없는 심각한 문제를 의미
예외(Exception): 개발자가 구현한 로직에서 발생한 실수나 사용자의 영향에 의해 발생
* 예외의 경우 별도의 처리 코드를 작성하여 방지할 수 있다.
Try ~ Catch
public static void main(String[] args) {
FileInputStream is = null;
try { // 예외가 될만한 코드를 try영역에 지정한다.
is = new FileInputStream("number.txt");
int num = 0;
System.out.println("code 1, num: " + num);
int i = 1 / num;
System.out.println("code 2 - 예외 없음: " + i);
return;
} catch (ArithmeticException e) { // try영역에서 예외가 발생한다면 Catch문을 실행
System.out.println("code 3 - exception handling 완료");
} finally { // try ~ catch가 끝난 뒤 실행 된다. 예외 발생 유무와 상관없이 항상 실행
if(is != null) is.close();
System.out.println("code 4 - 언제나 실행");
}
System.out.println("code 5");
}
e.getMessage(): 발생한 예외에 대한 구체적인 메시지를 반환한다.
getCause(): 예외의 원인이 되는 Throwable 객체 또는 null을 반환한다.
사용 후 자원을 반납이 필요한 자원들은 모두 Closable 인터페이스를 구현하고 있고, 사용 후 close 메서드를 호출해야 한다.
Try ~ with ~ resources
public static void main(String args[]) throws IOException {
try (FileInputStream is = new FileInputStream("trywithresources.txt"); BufferedInputStream bis = new BufferedInputStream(is)) {
int data;
while ((data = bis.read()) != -1) {
System.out.print((char) data);
}
}
}
try문에 사용할 자원을 선언해 주고, 사용이 끝났을 때, 자동으로 반납해 주는 문법이다.
try-catch를 이용하였을 때, 자원을 반납하는 코드를 반드시 명시를 해야 하는 불편함이 있어서(귀찮아서)
Java7부터 생겼다.
이 문법을 사용하기 위해서는 자원들이 Closable의 부모 클래스인 AutoCloseable 인터페이스를 구현해야 한다.
Throws
public void sell(String isbn, int quantity) throws QuantityException, ISBNNotFoundException {
if(searchByisbn(isbn) == null) throw new ISBNNotFoundException(isbn);
for(int i = 0; i < books.size(); i++) {
if(books.get(i).getQuantity() - quantity < 0) throw new QuantityException();
}
}
}
- method에서 처리해야 할 하나 이상의 예외를 호출한 곳으로 전달한다.(처리 위임, 없어지지 않는다.)
- API는 사전에 예외가 발생할 수 있음을 선언부에 명시하고 대처하도록 강요한다.
- 오버라이딩 시 조상 클래스 메서드가 던지는 예외보다 부모인 예외를 던질 수 없다.
사용자 정의 예외
//도서고유 번호가 존재하지 않는 예외정보를 나타내는 클래스
public class ISBNNotFoundException extends Exception {
private String isbn;
// 고유번호를 받아 생성하는 생성자
public ISBNNotFoundException(String isbn) {
super(isbn+"고유번호는 존재하지 않습니다.");
this.isbn = isbn;
}
// 존재하지 않는 도서 고유번호를 반환한다.
public String getIsbn() {
return isbn;
}
}