2013-03-25 2 views
31

인터페이스가 예외를 throw하는 곳에서는이 코드를 읽지 만 구현하는 클래스는 예외를 던지거나 catch하지 않습니다. 이유는 무엇입니까? 그것은 자바에서 합법적인가 안전합니까?Java 인터페이스가 예외를 throw하지만 인터페이스 구현이 예외를 throw하지 않습니다?

import java.rmi.*; 
public interface MyRemote extends Remote { 
    public String sayHello() throws RemoteException; 
} 

import java.rmi.*; 
import java.rmi.server.*; 
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{ 
    public String sayHello() { 
     return "Server says, 'Hey'"; 
    } 
    public MyRemoteImpl() throws RemoteException {} 
    public static void main (String[] args) { 
     try { 
      MyRemote service = new MyRemoteImpl(); 
      Naming.rebind("RemoteHello", service); 
     } catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 
+2

http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interface –

+2

에서 토론을 확인해 보는 것이 좋습니다. 맞습니다. 그리고 Cheetter가 게시 한 링크를보아야하며 대답으로 게시해야 할 수도 있습니다 .. – Thihara

+0

Thanks Thihara. 그렇게 했어. –

답변

47

구현 및 확장의 일반적인 규칙은 당신의 새로운 클래스 또는 인터페이스 "덜 제한적인"하지만 "더 제한적"없습니다 할 수있다. 예외를 제한 사항으로 처리해야한다는 요구 사항을 생각하면 예외를 선언하지 않는 구현은 덜 제한적입니다. 인터페이스를 코딩하는 사람은 누구나 수업에 문제가되지 않습니다.

— 스탠 제임스


자바 메소드는 인터페이스에 정의하는 방법을 부모 클래스에서 서로를 무시하거나 구현하는 경우 http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interface

+1

명확한 설명에 감사드립니다. 말이된다 –

11

에서 논의의 일환으로, 그것은 확인 된 예외는 더 이상 throw하지 않을 수 있지만 더 적게 throw 될 수 있습니다.

public class A { 
    public void thrower() throws SQLException {...} 
} 

public class B extends A { 
    @Override 
    public void thrower() throws SQLException, RuntimeException, NamingException {...} 
} 

SQLException; 재정의 된 메소드에서 선언되었습니다. 심지어 SerialException과 같은 하위 클래스로 대체 될 수도 있습니다.

RuntimeException; 그 (것)들은 어디에서든지 이용 될 수있다.

NamingException은 잘못되었습니다. RuntimeException이 아니며 하위 유형으로도 A의 목록에 없습니다.

관련 문제