새소식

Java

[JAVA] Exception

  • -

 

 

Exception과 Error의 차이

오류(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을 반환한다.

printStackTrace(): 예외가 발생된 메서드가 호출되기까지의 메서드 호출 스택을 출력(디버깅용)

- 반환값이 없고, 예외 결과를 화면에 출력해 준다.

하나의 try에 여러 개의 catch를 추가할 수 있다.(자식 -> 부모 순서 권장)

|(or) 기능을 이용해 한번에 2가지 이상의 예외처리도 가능하다.

 

 

 

사용 후 자원을 반납이 필요한 자원들은 모두 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;
	}
}

 

이런 식으로 예외를 직접 만들어서 사용할 수도 있다.

'Java' 카테고리의 다른 글

[JAVA] ConcurrentHashMap  (0) 2025.05.17
[JAVA] File I/O  (0) 2024.07.28
[JAVA] Stream API  (0) 2024.07.25
[JAVA] Lambda  (0) 2024.07.24
[JAVA] Comparable? Comparator?  (3) 2024.07.23
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.