자바의 정석 8장. 예외처리

8장. 예외처리

1.1 프로그램 오류 p.414

컴파일 에러 : 컴파일 시에 발생하는 에러 런타임 에러 : 실행 시에 발생하는 에러 논리적 에러 : 실행은 되지만 의도와 다르게 동작하는 것

  • 처리 가능 여부에 따라

에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류 예외(exception) : 프로그램 코드에 의해 수습될 수 있는 다소 미약한 오류

1.2 예외 클래스의 계층구조 p.415

  • Throwable

http://www.plantuml.com/plantuml/png/SoWkIImgAKygLb3oJIpAJialprFYqb88oIZABqzCoadbujHISAr8JYqeoSpFu-84ye9AyqeoSrDH1VNqzC2qfpzS7Aopg2Y_24M1Vsc9VvflQcv-KIL4qY4rBoKt4uWJ2m00

  • Exception

https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F9045cf63-a81c-4e91-a2df-7a6f59a9ea00%2FUntitled.png?table=block&id=15976be8-705f-41e6-9c2c-b0cd6b5ad2ac&spaceId=e61b686e-d1af-4c3a-9777-c12e83dc3275&width=1900&userId=eb87f607-930d-4f18-83f2-eaab20fcf33d&cache=v2

Excetion클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 RuntimeException클래스들 : 프로그래머의 실수로 발생하는 예외

catch 순서 p.421
package chap8;

public class ExceptionEx7 {
	public static void main(String args[]) {
		try {
			int i = 1/0;
		} catch (Exception e) {
		} catch (ArithmeticException e) {
			//"Unreachable catch block for ArithmeticException. It is already handled by the catch block for Exception"
		}
	}
}
Exception.printStackTrace() vs @Slf4j logger.error() p.422 https://stackoverflow.com/a/10477646/4766882

printStackTrace()는 단순히 오류를 어딘가에 출력하는데 그치지만 Slf4j를 쓰면 출력을 할지 말지 부터 어디에 출력할지를 소스 수정없이 조절가능. 출력은 시스템 런타임 성능을 저하시키는 주요 요인

예외의 종류 : 컴파일러가 체크할 수 있는가
  1. checked : 컴파일러가 체크 가능. 컴파일 에러 발생(소스를 수정해야 컴파일 될 것이므로 코딩 시에 excetion에 대한 대처가 가능)
  2. unchecked : 컴파일러가 체크 불가능. 컴파일 에러 발생하지 않음

언제 Exception을 사용할까? 가능한 안써야 한다. 특히 ‘제어로직에 예외를 사용하지 마라’

  1. 소스 가독성 저하(goto문이랑 동일함)
  2. 런타임의 속도저하

언제 Exception(throws)을 사용할까?

호출stack이 깊을 때 예외 상황을 우아하게 처리하기 위해. ‘예외를 마지막에 처리하는 쪽은 최초 call을 발생시킨 객체다’

1.9 자동 자원 반환 - try-with-resources

  1. 소스가 많이 짧아져서 가독성이 좋아졌다.
  2. 해당 리소스는 AutoCloseable인터페이스를 구현해야 한다.
  • before
Scanner scanner = null;
try {
    scanner = new Scanner(new File("test.txt"));
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (scanner != null) {
        scanner.close();
    }
}
  • after
try (Scanner scanner = new Scanner(new File("test.txt"))) {
    while (scanner.hasNext()) {
        System.out.println(scanner.nextLine());
    }
} catch (FileNotFoundException fnfe) {
    fnfe.printStackTrace();
}

1.10 사용자정의 예외 만들기

필요에 따라 예외처리의 여부를 선택할 수 있는 ‘unchecked’예외가 강제적인 ‘checked예외’보다 더 환영받고 있다 👉 하지만 예외처리를 강제하기 위해서는 checked예외가 필요

1.12 연결된 예외(chained exception)

여러가지 예외(원인과 결과)를 하나의 큰 분류의 예외로 묶어서 다루기 위해