Search

자바의 정석 Chapter 8 : 예외처리

컴파일러의 기능
구문체크, 번역, 최적화
생략된 코드 추가
프로그램 오류
컴파일 에러(compile-time error) : 구문 등의 오류로 실행 전 컴파일 단계에서 잡는 에러
런타임 에러(runtime error) : 컴파일은 정상적으로 됐지만 실행 중 JVM에서 발생하는 에러
논리적 에러(logical error) : 작성 의도와 다르게 동작하는 에러
Java의 런타임 에러
에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 미약한 오류
예외처리(exception handling)
에러는 어쩔 수 없지만 예외는 처리하자!!!
정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
목적 : 프로그램의 비정상 종료를 막고 정상적인 실행상태를 유지하는 것
예외 클래스의 계층 구조
Exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
RuntimeException 클래스들 : 프로그래머의 실수로 발생하는 예외
try-catch문
Exception이 선언된 catch 블럭은 모든 예외 처리를 하기 때문에 마지막에 있어야 한다
예외 객체의 메서드
printStackTrace() : 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다
getMessage() : 발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다
멀티 catch 블럭 (jdk1.7부터)
부모 자식 관계에서는 멀티 catch 블럭을 쓰지 말고 부모 타입만 사용한다 (코드중복 최소화)
ExceptionA와 ExceptionB 중 참조변수에 어떤 예외가 들어갈지 모르기 때문에 형변환을 해서 사용한다
(공통 메서드는 사용 가능)
예외 발생시키기
throw
checked 예외
1.
컴파일러가 예외 처리 여부를 체크(예외 처리 필수, try-catch 필수)
2.
Exception 클래스와 그 자손들이 있다
unchecked 예외
1.
컴파일러가 예외 처리 여부를 체크 안함(예외 처리 선택, try-catch 선택 )
2.
RuntimeException 클래스와 그 자손들이 있다
예외를 처리하는 방법
상황에 맞게 호출된 메서드에서 try-catch문으로 처리할지 아니면 호출한 메서드로 떠넘겨서 try-catch문으로 처리할지 선택해야 한다!!!
(무조건 try-catch문으로 처리하긴 해야함)
1.
직접 처리(try-catch문)
2.
예외 떠넘기기(알리기)
3.
은폐(무시)
finally 블럭
예외 발생 여부에 관계 없이 무조건 실행해야 하는 문장!
사용자 정의 예외 만들기
우리가 직접 예외 클래스를 정의할 수 있다
조상은 Exception과 RuntimeException중에서 선택
1.
Exception : 필수처리라 꼭 try-catch문을 써야하므로 꼭 필요한 경우만 선택
2.
RuntimeException : 선택처리라 try-catch문을 안써도 되므로 웬만하면 이걸 선택
꼭 String 매개변수가 있는 생성자를 넣어 호출해줘야함!!!!!!
예외 되던지기(exception re-throwing)
예외를 처리한 후에 다시 예외를 발생시키는 것
호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리를 하는 것
연결된 예외(chained exception)
한 예외가 다른 예외를 발생시킬 수 있다
예외 A가 예외 B를 발생시키면 A는 B의 원인 예외(cause exception)이다
연결된 예외를 사용하는 이유
여러 예외를 하나로 묶어서 다루기 위해서
checked 예외를 unchecked 예외로 변경하러 할 때