2013-03-25 18 views
31

Czytam ten kod, w którym interfejs zgłasza wyjątek, ale klasa, która go implementuje, nie wyrzuca ani nie przechwytuje, dlaczego tak jest? Czy jest to legalne lub bezpieczne w java?Interfejs Java zgłasza wyjątek, ale implementacja interfejsu nie generuje wyjątku?

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

Możesz zajrzeć do dyskusji na stronie http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interface –

+2

Tak, to jest legalne. I powinieneś zobaczyć link opublikowany przez CHetter, a on również powinien go opublikować jako odpowiedź .. – Thihara

+0

Dzięki Thihara. Zrobiłem to. –

Odpowiedz

47

Ogólną zasadą jest wdrożenie i rozszerzenie można dokonać nowej klasy lub interfejsu „mniej restrykcyjna”, ale nie „bardziej restrykcyjne”. Jeśli uważasz, że wymóg obsługi wyjątku jest ograniczeniem, implementacja, która nie deklaruje wyjątku, jest mniej restrykcyjna. Każdy, kto zakoduje interfejs, nie będzie miał problemów z twoją klasą.

— Stan James


W ramach dyskusji na http://www.coderanch.com/t/399874/java/java/Methods-throwing-Exception-Interface

+1

Dziękuję za jasne wyjaśnienie. Ma sens –

11

Jeśli metoda Java nadpisuje drugiego w kategorii macierzystego lub realizuje sposób zdefiniowany w interfejsie, to nie może dodawać dodatkowych sprawdzonych wyjątków, ale może rzucać mniej.

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

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

SQLException jest w porządku; jest zadeklarowany w nadpisanej metodzie. Może nawet zostać zastąpiona podklasą, taką jak SerialException.

RuntimeException jest w porządku; można je wykorzystać w dowolnym miejscu.

NamingException jest nielegalne. Nie jest to RuntimeException i nie znajduje się na liście A, nawet jako podtyp.

Powiązane problemy