2009-11-08 16 views
1

je la déclaration d'interface suivante:Signature de méthode déclarée comme throws Exception; mis en œuvre en jette une sous-classe d'exception

public interface SomeInterface { 

    void someMethod() throws Exception; 

} 

J'utilise un tiers pour générer une implémentation de cette classe (JavaCC - pour les curieux)

Les regards de classe générés naïvement comme ceci:

public class SomeClass implements SomeInterface { 

    public void someMethod() throws SomeException { 

    // Does something 

    } 
} 

SomeException est bien sûr une sous-classe de Exception.

(Pas) de façon surprenante le code ne compile pas.

Quelqu'un a-t-il des commentaires à ce sujet?

Merci!

EDIT:

rebaptisé la méthode SomeMethod()-someMethod().

Il avait été une faute de frappe de la mienne ... (désolé)

EDIT # 2:

Désolé tout - énorme erreur de la mienne. L'écriture de cet exemple m'a forcé à supprimer le code. Je n'avais pas remarqué que l'erreur était ailleurs et pas avec la signature.

Cest la « magie » de la compilation d'exécution et le chargement de classe personnalisée ...

+0

"n'importe quelle entrée?" n'est pas une question avec une réponse définitive. –

+0

Le code affiché sera compilé. Pouvez-vous reproduire le problème avec cet exemple de code? – Yishai

+1

Une énorme erreur à moi. Comme j'ai dû supprimer le code pour cet exemple, je n'ai pas remarqué que le problème avait été ailleurs ... Vraiment désolé pour ça !!!! – Yaneeve

Répondre

1

Il ne compile pas parce que les noms de méthode ne sont pas les mêmes (vérifier les bouchons sur S/someMethod)

+0

Mais si vous corrigez cela, il devrait compiler correctement. –

+0

juste une faute de frappe dans StackOverflow ... – Yaneeve

+2

Mais cela compile: import java.io.*; interface SomeInterface { \t void someMethod() throws Exception; } SomeClass de classe implémente UneInterface { someMethod public void() throws IOException {// fait quelque chose }} Le problème doit être quelque chose d'autre ... –

1

Le cas est important en Java. Votre interface indique someMethod et votre classe indique SomeMethod.

+0

juste une faute de frappe dans StackOverflow. – Yaneeve

0

Pourquoi votre méthode d'interface lance-t-elle une exception? C'est presque toujours faux. L'exception est juste le type de base à partir duquel le reste s'étend; Ce n'est pas destiné à être utilisé de cette façon.

+0

En raison de problèmes de chargement de classe ... Le code qui génère la classe génère également l'exception qui sera chargée dans un chargeur de classe différent de l'interface. Je ne peux pas, à ma connaissance, faire en sorte que l'interface utilise le même type d'exception puisqu'elle ne sera plus jamais la même. Est-ce que c'est un peu plus clair maintenant? – Yaneeve

+0

Il y a parfois une raison de le faire: il est dit que la méthode peut lancer une exception vérifiée spécifique à l'implémentation. Considérons par exemple un mécanisme de persistance qui pourrait écrire dans une base de données ou un fichier. L'un lève SQLException, l'autre lève IOException. Dans les deux cas, l'application doit intercepter l'exception lorsqu'une écriture échoue et effectuer une action (allant simplement de l'encapsulation dans une RuntimeException/sous-classe à la génération d'une page/d'une boîte de dialogue d'erreur personnalisée). – kdgregory

+0

Quel est le problème avec le lancer de méthode d'interface? Si la mise en œuvre doit être lancée, suggérez-vous de la décocher, ce qui ne serait pas documenté par l'interface? Cela semblerait totalement faux. – user443854

0

L'une des méthodes de protection est publique et l'autre est par défaut, c'est pourquoi votre code ne compile pas. Rendre public ou par défaut.