2010-01-30 5 views
12

Je voulais demander comment le mentionner dans mon interfaceLancer plusieurs exceptions dans une méthode d'une interface en Java

public class find(int x) throws A_Exception, B_Exception{ 
---- 
---- 
--- 
} 

je veux dire que je peux mentionner une exception dans une interface, mais comment parler dans mon interface que ma méthode jetteront Deux exceptions à savoir A et B ...

le fragment de code mentionné ci-dessus fonctionne uniquement pour A et non B ... Aide

public interface dictionary{ 
    public void insert(int x) throws Dictionary_FullException, Duplicate_Element_FoundException; 
} 
... 
public class SortedArray implements dictionary{ 
    public void insert(int x) throws Dictionary_FullException, Duplicate_Element_FoundException { 
--------- 
} 

mais quand je COMPI le ... il dit ..

SortedArray.java:66: insert (int) dans assign.SortedArray ne peut pas mettre en œuvre insert (int) dans assign.dictionary; méthode surchargée ne jette pas assign.SortedArray.Duplicate_Element_FoundException publique void insert (int x) lance Dictionary_FullException

+5

'public class trouver (int x)', compile-t-il jamais? Et comment cela est-il lié à une interface? – BalusC

Répondre

19

Vous pouvez déclarer autant d'exceptions que vous le souhaitez pour votre méthode d'interface. Mais la classe que vous avez donnée dans votre question n'est pas valide. Il faut lire

public class MyClass implements MyInterface { 
    public void find(int x) throws A_Exception, B_Exception{ 
    ---- 
    ---- 
    --- 
    } 
} 

Puis une interface se présente comme suit

public interface MyInterface { 
    void find(int x) throws A_Exception, B_Exception; 
} 
2

Vous devez spécifier sur les méthodes qui peuvent jeter les exceptions. Vous les séparez simplement par un ',' s'il peut lancer plus d'un type d'exception. par exemple.

public interface MyInterface { 
    public MyObject find(int x) throws MyExceptionA,MyExceptionB; 
} 
4

Je pense que vous demandez quelque chose comme le code ci-dessous:

public interface A 
{ 
    void foo() 
     throws AException; 
} 

public class B 
    implements A 
{ 
    @Overrides 
    public void foo() 
     throws AException, 
       BException 
    { 
    } 
} 

Cela ne fonctionnera pas à moins BException est une sous-classe de AException. Lorsque vous remplacez une méthode, vous devez vous conformer à la signature fournie par le parent et les exceptions font partie de la signature.

La solution est de déclarer que l'interface lance également une BException.

La raison est que vous ne voulez pas de code comme:

public class Main 
{ 
    public static void main(final String[] argv) 
    { 
     A a; 

     a = new B(); 

     try 
     { 
      a.foo(); 
     } 
     catch(final AException ex) 
     { 
     } 
     // compiler will not let you write a catch BException if the A interface 
     // doesn't say that it is thrown. 
    } 
} 

Que se passerait si B :: foo a jeté un BException? Le programme devrait sortir car il ne pourrait y avoir aucune capture pour cela. Pour éviter des situations comme celle-ci, les classes enfants ne peuvent pas modifier les types d'exceptions lancées (sauf qu'elles peuvent supprimer des exceptions de la liste).

Questions connexes