Java/Java의 정석

[Java의 정석] 7.2 메소드 오버라이딩 시 예외 선언

동현 유 2022. 3. 14. 11:08

책에서는 예외 부분을 굉장히 간단하게 설명이 되어있는 것 같아, 더 구체적인 자료를 찾아봄

"예외는 조상 클래스이 메서드보다 많이 선언할 수 없다." 라고 적혀있지만, 엄밀히 말하면 checked Exception 에만 해당하는 내용이다. unchecked Exception 에 대해서는 자식 클래스에서 추가로 선언해도 상관없다.

 

(case 1) 부모 메서드가 checked exception 던질 때,

class Parent{
   
    void method1()  throws SQLException {  //checked exception
       
    }
}
 
class Child extends Parent{
   
    void method1()  {
       
    }
}

(case 2) 부모 메서드가 unchecked exception 던질 때, 

class Parent{
   
    void method1()  throws RuntimeException { // unchecked exception
       
    }
}
 
class Child extends Parent{
   
    void method1()  {
       
    }
}

(case 3) 자식이 부모가 던지지 않는 checked exception 을 던질 때 => compile error

class Parent{
   
    void method1()   {
       
    }
}
 
class Child extends Parent{
   
    void method1() throws SQLException { // checked exception, compile error
       
    }
}

(case 4) 자식이 부모가 던지지 않는 unchecked exception 을 던질 때, ok

class Parent{
   
    void method1()   {
       
    }
}
 
class Child extends Parent{
   
    void method1() throws RuntimeException { // unchecked exception, ok
       
    }
}

(case 5) 아래는 컴파일 성공하는 경우, 두 예외의 자리를 서로 바꾸면 컴파일 오류

class Parent{
   
    void method1() throws SQLException  {
       
    }
}
 
class Child extends Parent{
   
    void method1() throws RuntimeException {
       
    }
}

(case 6) 부모가 선언하지 않은 checked exception 던지면 컴파일 오류

class Parent{
   
    void method1() throws IOException  {
       
    }
}
 
class Child extends Parent{
   
    void method1() throws SQLException {  // this exception is not a checked exception thrown by Parent!
       
    }
}

(case 7) 가능한 경우

class Parent{
   
    void method1() throws SQLException  {
       
    }
}
 
class Child extends Parent{
   
    void method1() throws  SQLDataException {  // SQLDataException is a child of SQLException!
       
    }
}