자바의 정석 chapter 8

inho ha·2022년 3월 3일
0

자바의 정석

목록 보기
9/18

에러

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

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

exception class

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

exception handling

프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것
프로그램의 비정상 종료를 막고, 실행상태를 유지할 수 있도록 하는 것이 목표

처리되지 못한 예외는 JVM의 UncaughtExceptionHandler가 받아서 예외의 원인을 화면에 출력한다.

try catch

try블럭에 예외 발생 가능성이 있는 코드를 넣고
catch 블럭에 특정 종류의 예외가 발생했을때 실행할 코드를 작성

발생한 예외가 catch 에 존재하지 않으면 예외처리되지 않음
모든 예외 클래스는 Exception클래스의 자손이므로 Exception클래스 타입의 참조변수를 선언해 놓으면 모든 예외 처리가능

printStackTrace() : 예외발생 당시 호출스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력
getMessage() : 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있음

멀티 catch 블럭

catch (ExceptionA | ExceptionB e) {
}

여러 예외 클래스를 동시에 catch 가능
단 예외 클래스끼리 자손 조상 관계면 컴파일 에러

throw

고의로 예외 발생 시키기

throws

메서드에서 발생할 가능성이 있는 예외 선언하기

void method() throws Exception1, Exception2 {
}

이를 이용하면 메서드를 사용하는 사람이 어떤 예외들을 처리해야하는지 쉽게 알 수 있음

finally

catch 블럭 이후에 작성하는 블럭
예외의 발생여부와 관계없이 코드를 실행한다.

try-with-resources

사용후에 close 해줘야하는 클래스들 try블럭을 벗어나는 순간 자동적으로 close 해준다.

try (fis = new FileInputStream("score.dat"); dis = new DataInputStream(fis)) {
}

finally에서 close를 해주도록 하면 이 close가 예외를 발생시킬 수 있어 이를 또 예외처리 해주어야한다.
try () 안에서 객체를 생성하는 문장을 넣으면 close를 자동으로 해주어 편하다.
자동으로 close 되려면 AutoCloseable 인터페이스를 구현한 클래스여야한다.

자동으로 호출된 close에서 예외가 발생하면 두개의 예외가 동시에 발생할 수는 없기 때문에 억제된(suppressed) 예외로 출력된다.

예외 클래스 만들기

예외 클래스를 상속받아서 예외 클래스를 만들수 있다

class MyException extends Exception {
	MyException(String msg) {
    	super(msg);
    }
}

요즘은 RuntimeException을 상속받아서 예외처리를 선택적으로 할 수 있도록 작성하는 편이다.

예외처리를 강제하도록 한 이유는 프로그래밍경험이 적은 사람들도 견고한 프로그램을 작성할 수 있게 유도하기 위한 것이었다.
요즘은 프로그래밍 환경이 달라져 예외처리의 여부를 선택할 수 있는 unchecked예외로 작성하는 편이다.

exception re-throwing

예외를 처리한 후에 인위적으로 다시 발생시키는 방법

한 메서드에서 발생할 수 있는 예외가 여럿인 경우, 몇 개는 try-catch문을 통해서 메서드 내에서 자체적으로 처리하고, 나머지는 선언부에 지정하여 호출한 메서드에서 처리하도록 하여 나눠서 처리하는 것이 가능하다.

catch 블럭에서 예외를 처리하고 throw로 예외를 던지면 된다.

chained exception

한 예외가 다른 예외를 발생시킬 수 있다

원인 예외 : 예외를 발생시킨 예외

다른 예외를 발생시킬때 원인 예외를 등록하여 생성한뒤 던지면 된다.

여러가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위함
checked예외를 unchecked예외로 바꿀 수 있도록 하기 위함

RuntimeException 을 발생시키면 unchecked예외로 바뀌게 되어 예외처리가 필수가 아니게 된다.

profile
iha / ian / inho ha

0개의 댓글