출처 : 자바의 정석
http://www.yes24.com/Product/Goods/24259565
https://cafe.naver.com/javachobostudy/20665
아래의 내용은 '자바의 정석'이라는 책의 내용을 간략하게 정리한 글입니다.
프로그램 오류
프로그램이 꺼지거나 의도하지 않은 로그가 많이 보일 때 구분없이 '에러'라고 지칭하고 사용해왔다.
하지만 이제는 에러와 예외를 구분해야한다.
예외(Exception)
예외 클래스는 두 분류로 나뉜다.
비정상적인 프로그램 종료를 막고, 런타임을 유지하면서 예외를 대응한다.
try {
//예외 발생 가능성이 있는 코드
} catch(Exception e){
//Exception 발생시 실행할 코드
}
catch블럭에서 인스턴스를 instanceof 연산자로 검사하여 'true'가 나올 때까지 계속 검사한다.
'true'가 나온 블럭의 문장들을 수행 후 try-catch문을 빠져나온다.
printStackTrace()
예외발생 당시의 호출스택(Call Stack)에 있던 메서드의 정보와 예외 메세지 출력
getMessage()
발생한 예외클래스의 인스턴스에 저장된 메세지 get
throw new Exception("Exception 고의 발생");
checked 예외(Exception클래스들)
컴파일러가 예외처리를 확인하는 예외
예외처리를 하지 않으면 컴파일부터 안된다.
unchecked 예외(RuntimeException클래스들)
컴파일러가 예외처리를 확인하지 않는 예외
예외처리를 하지 않아도 컴파일이 된다.
하지만 예외 발생시 비정상적으로 종료된다.
메서드의 선언부에 키워드 throws를 사용해서 메서드 내에서 발생할 수 있는 예외를 기입한다.
메서드 사용자가 메서드 선언부만 보고 발생할 예외를 예측하고 대비할 목적이다.
throws는 예외처리가 아니라 throws가 명시된 메서드를 호출한 메서드에게 예외를 전달하는 것이다.
예외의 발생여부에 상관없이 마지막에 무조건 실행되어야할 코드 블럭
try블럭에 return문이 실행되어도 finally블럭이 실행되고 종료된다.
자동 자원 반환 try-with-resource문
JDK1.7부터 try-with-resource문이 추가됐다.
try (FileInputStream fis = new FileInputStream("File.txt");
DataInputStream dis = new DataInputStream(fis)){
}catch(Exception e){}
try 괄호 안에 객체 생성 문장을 넣으면 이 객체는 따로 close()를 호출하지 않아도 try블럭을 벗어나는 순간 자동으로 close()를 호출한다.
단, try-with-resource문에 의해 자동으로 close()가 호출되려면 try 괄호 안에 생성된 객체가 AutoCloseable이라는 인터페이스를 구현한 것만 된다.
try-with-resource에서 두 예외가 발생하면 먼저 발생한 예외를 실제 발생한 예외로 다루고 나중에 발생한 예외를 억제된(suppressed)예외로 다룬다.
출력문에 suppressed 예외 문장이 같이 출력된다.
try-catch문에서는 먼저 발생한 예외는 무시되고 마지막에 발생한 예외만 출력한다.
사용자정의 예외
Exception or RuntimeException을 상속받아 구현
기존에는 견고한 프로그램을 위해 예외처리를 무조건 해야하는 checked 예외가 주를 이루었지만
요즘에는 예외처리를 선택적으로 사용하는 unchecked 예외를 많이 사용한다.
발생할 수 있는 예외가 여러 개인 경우, 메서드 내에서 예외처리하고 호출한 메서드에서도 처리하도록 할 수 있다.
예외를 처리한 후 인위적으로 예외를 다시 발생시키는 방법으로 구현한다.
public static void main(String[] args){
try{
method();
}catch (Exception e){
//후 예외처리
}
}
static void method() throws Exception{
try{
throw new Exception();
}catch (Exception e){
//선 예외처리
throw e; //인위적 예외 발생
}
}