2016-11-06 2 views
2

아래 코드를 살펴보면 throws 예외와 함께 오버라이드에 대한 개념을 명확히하고 싶습니다. 제공된 코드가 아래에 작동합니까, 그렇다면 왜? 나는 IOException과 ArithmeticException 사이에 직접적인 부모 자식 관계가 없기 때문에이 질문을하고있다. ArithmeticExceptionRuntimeException 연장 있지만 때문에재정의하는 동안 상위 하위 계층 구조가 중요합니다.

public class TestExceptionChild { 

    public static void main(String[] args) { 
     Parent parent = new Child(); 
     try { 
      parent.msg(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

class Parent{ 
    void msg() throws IOException{ 
     System.out.println("parent"); 
    } 
} 

class Child extends Parent{ 
    void msg() throws ArithmeticException{ 
     System.out.println("child"); 
    } 
} 

답변

1

이 작동한다 (즉, 그렇지 체크 예외하므로 throws 절 사용 여기 불필요하다). ArithmeticException 대신 확인 된 예외를 사용하는 경우 IOException 유형이어야합니다. 그렇지 않으면 컴파일 오류가 발생합니다.

질문에 대답하려면 예, 의 경우 계층 구조가 중요하며 예외가 확인되었습니다. 자세한 내용은 here을 참조하십시오.

+1

'IOException'은'RuntimeException'이 아닙니다. 오버라이드 (override) 된 메소드가'throws IOException'를 가질 필요가없는 이유는 무엇입니까? 어떻게 * 아무것도 * 던질 수 있지만 다른 종류의 검사 예외를 throw하지 않습니다? – Gendarme

+0

@Gendarme "throws nothing"을'throws IOException'의 부분 집합으로 생각할 수 있습니다. 그러나 반대는 사실이 아닙니다. 부모가 아무것도 throw하지 않는 경우, 오버라이드 (override) 된 아이는 체크 예외를 슬로우 할 수 없습니다. – pathfinderelite

+0

물론. 나는 깨달았어야했다. – Gendarme

관련 문제