Exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 (사용자의 동작)
RuntimeException 클래스들 : 프로그래머의 실수로 발생하는 예외 (프로그래머의 실수)
catch 블럭부터 차례로 내려가면서 catch블록의 괄호 내에 선언된 참조변수의 종류와 생성된 예외클래스의 인스턴스에 instanceof 연산자를 이용하여 검사, 검사결과가 true인 catch블럭을 만날때까지 검사를 계속함.
참고 : printStackTrace(PrintStream) or printStackTrace(PrintWriter s)를 통해 예외에 대한 정보를 파일에 저장 가능
'|' 기호를 사용해서 멀티 catch 블록 사용가능 (jdk 1.7)
try{
...
} catch(Exception | RunTimeException e) {
// 처리
}
'|'로 연결된 예외 클래스가 조상/자손 관계면 컴파일 에러. e의 catch 블록의 공통 분모 조상 예외 클래스에 선언된 멤버만 사용 가능.
throw new Exception()
RuntimeException은 프로그래머의 실수로 발생하기 때문에 예외처리 강제 X
throws Exception
throws의 명시하는 것은 예외를 처리하는 것이 아닌, 자신을 호출한 메서드에게 예외를 전달하여 예외처리를 떠맡기는 것.
finally : 예외 관계없이 실행
jdk 1.7 부터 try-with-resources 제공
try (SomeResource resource = getResource()) {
use(resource);
} catch(...) {
...
}
괄호 안에 객체 생성 문장을 넣으면, 이 객체는 close()를 호출하지 않아도 try 블록을 벗어나는 순간 자동으로 close() 호출.
public interface AutoCloseable {
void close() throws Exception;
}
close()가 호출되려면 클래스가 이 인터페이스를 구현해야 한다.
exception을 상속하여 만들기
예외 처리를 나눠서 처리
class ExceptionEx17 {
public static void main(String[] args) {
try {
method1();
} catch (Exception e) {
System.out.println("main메서드에서 예외가 처리되었습니다.");
}
}
static void method1() throws Exception{
try {
throw new Exception();
} catch (Exception e) {
System.out.println("method1 에서 예외가 처리되었습니다.");
throw e;
}
}
}