메소드를 만들때, 호출하는 쪽에서 에러처리를 해야할 경우 throws 란 키워드를 사용한다.
하지만 throws로 던질 에러가 RuntimeException 을 상속받는 에러일 경우 호출하는 쪽에서는 별도로 에러처리를 하지 않아도 컴파일&실행이 정상적으로 된다.
public class Test {
public void throwsExample1() throws ClassCastException {
}
public void throwsExample2() throws IOException {
}
}
public class MainClass {
public static void main(String[] args) {
Test test = new Test();
// 에러처리 안해도 정상 컴파일
test.throwsExample1();
// 에러처리 안하면 컴파일 에러 발생
test.throwsExample2();
}
}
예를 들면 Test클래스의 throwsExample1 메소드는 ClassCastException 을 throws 하는데,
ClassCastException은 RunTimeException을 상속받는 클래스이다.
그러므로 컴파일때, 컴파일에러가 발생하지않는다.
반면에, throwsExample2는 IOException을 throws하는데,
IOException은 Exception을 상속받는다.
그래서 반드시 에러처리를 해야한다. (try~catch or throws...)
참고로 RunTimeException, IOException은 모두 Exception을 상속받는 공통점이 있다. (둘은 완전 다른 클래스가 아니라 RunTimeException이라는 특별한 클래스가 있다는것을 기억하자.)
또한 Exception은 Throwable이라는 클래스를 상속받는다.
Throwable은 Exception, Error라는 두가지의 서브클래스 타입을 가지는데 Error은 프로그램내에서 어떻게 할 수 있는 에러들이 아니기 때문에, 코드레벨에서 해결할 수 있는 방법이 없다. (예: OOM)
'Language > Java' 카테고리의 다른 글
Stomp Heartbeat (for Spring) (0) | 2021.04.25 |
---|---|
Stack 대신에 Deque를 사용하자 (0) | 2021.03.09 |
Abstract VS Interface (0) | 2020.05.22 |
JVM 정리 (0) | 2020.05.22 |