2013-05-08 2 views
1

나는 스스로 시험을 준비하고 있는데, 나는 이해할 수없는이 코드를 발견했다.왜 내가 예외를 던질 몇 가지 방법을 덮어 쓸 수 있습니까?

이와 같은 메서드를 재정의하면 컴파일 할 수 없습니다. 알았어. 2 번째 줄에 부모 예외를 던져야하고 (Exception을 throw하는 것처럼) 잘 작동 할 것입니다 ... 그렇다면 왜 7 행을 변경 할 수 있습니까? public void charlie throw NullPointerException ?? 나는 아직도 (이 RuntimeException를 확장하기 때문에) 2.

1.public class A { 
    2. public void charlie() 
    3. { 
    4. 
    5. } 
    6. class B extends A{ 
    7.  public void charlie() throws IOException 
    8.  {} 
    9. } 
    10.} 

답변

8

NullPointerException체크되지 않는 예외입니다 라인에 아무것도 던지는 아니에요 때문에, 잘 컴파일합니다. 선언 할 필요가 없으며 다른 어떤 것에도 영향을 미치지 않고 을 선언 할 수 있습니다.

체크 된 예외 및 확인되지 않은 예외에 대한 이해를 수정해야합니다.

Java exceptions tutorial은 아마도 적절한 출발점 일 것입니다.

+0

맞습니다. IOException은 확인 된 예외이므로 정책을 설정해야하며 NullPointerException은 확인되지 않은 예외가 있으므로 필요하지 않습니다. :) –

0

IOException 예외는 이어야 함; try-catch 블록이 없으면 throws 메서드를 호출 할 수 없습니다. Athrows 선언이 없기 때문에,

A myObject; 
myObject = new B(); // legal - polymorphism 
myObject.charlie(); 

하나는이 오류가 발생하지 않을 것이라고 예상 할 수 있지만, B 수행합니다

그러나, 이제 다음을 고려. 따라서이 코드는 합법적 일 수 없습니다.

메서드는 보다 적게 throw 예외를 선언 할 수 있지만 을 제외한 문자는이 아닙니다.

1

대답은 쉽습니다. 클래스 A의 원래 메소드가 던진 것을 "지원"하지 않으면 클래스 B의 덮어 쓰기 메토에서 예외를 throw 할 수 없습니다.

의 당신이 다른 곳에서 메소드를 호출한다고 가정 해 봅시다 : A doens가 예외를 던질

A a = new A(); 
a.charlie(); 

의 메소드 charlie 때문에

, 그것은 OK입니다.

private A getA() { 
    return new B(); //this will work since B extends A 
} 

private void doSomething() { 
    A a = new A(); //you could also write A a = new B(); 
    a.charlie(); 
} 

지금이 코드를 취 그 메소드가 예외를 슬로우하면 뭔가라는 클래스 다형성 작업 모드가 복잡하게되어 있기 때문에, 당신은

A a = new A(); 
try { 
    a(); 
} catch(IOException ex) { //or any other exception 
    //oh noes 
} 

를 작성해야하지만 지금은 복잡해진다 a 클래스 A의 객체 였으므로 던져진 예외가없는 charlie() 메서드가 있습니다. a이 클래스 B의 개체이더라도 컴파일러는이를 알지 못하며 B 클래스의 메서드에서 예외가 발생하지 않습니다. a은 최소한 컴파일러의 관점에서 볼 때 A 클래스에 있기 때문에 예외입니다.

A에서와 같이 B 클래스의 메소드 이 동일해야합니다 (입력 매개 변수, 반환 유형 및 예외 예외). 메소드의 본문 만 변경할 수 있습니다.

그러나 NullPointerException 또는 UnsuportedOperationException은 RuntimeException에 속하므로 Java의 모든 기존 메소드가 RuntimeException을 자동으로 처리하므로 원하는 경우 언제든지 던질 수 있습니다.

관련 문제