2010-08-19 4 views
2

juste au regard programme ci-dessous ..gestion des exceptions java dans l'héritage

import java.io.*; 
import java.rmi.*; 
class class1 
{ 
public void m1() throws RemoteException 
{ 
System.out.println("m1 in class1"); } } 

class class2 extends class1 
{ 
    public void m1() throws IOException 
{ 
    System.out.println("m1 in class2"); 

} } 

class ExceptionTest2 
{ 
public static void main(String args[]) 
{ 
    class1 obj = new class1(); 
    try{ 
obj.m1(); 
} catch(RemoteException e){ System.out.println("ioexception"); } 

} } 

Erreur de compilation de temps ..... ne peut pas passer outre m1() Méthode

Maintenant, si je remplace RemoteException en classe parent IOException et vice versa en classe enfant. Ensuite, il compile.

Toutes les autres combinaisons d'exceptions vérifiées ne fonctionnent pas ici, même si j'utilise une exception vérifiée qui sont au même niveau.

Maintenant, je suis confus pourquoi l'écrasement n'a lieu que dans un cas, pas dans d'autres cas ??? J'apprécierai vraiment votre réponse.

+0

Vous avez déjà posté cette question http://stackoverflow.com/questions/3520596/i-am-learning-the-exception-handling-in-java-basically-in-inheritance –

Répondre

0

Une exception RemoteException est une IOEception, mais pas l'inverse. Puisque la classe 2 étend la classe 1, toutes les exceptions levées doivent être compatibles avec les exceptions de la superclasse. Lorsque class1.m1 déclenche une exception IOException, class2.m1 peut déclencher une exception RemoteException car il s'agit d'une spécialisation d'une exception IOException. Parce que deux méthodes avec les mêmes signatures ne peuvent pas lancer différents types d'exceptions.

0

2

RemoteException est plus spécifique que IOException donc vous pouvez déclarer que le membre m1() de la classe héritière le renvoie. (RemoteException hérite de IOException et donc RemoteException est un type spécial de IOException).

Il ne fonctionne pas dans l'autre sens: en précisant que TOUT objet de type class1 jette un RemoteException dans son membre m1(), vous ne pouvez pas spécifier que la même méthode dans class2 jette quelque chose de plus générique (parce que le type class2 les objets sont également des objets de type class1).

3

Exceptions règle Inheritance va comme ceci:

« Quand une sous-classe remplace une méthode dans la classe super alors la définition de la méthode sous-classe peut spécifier que tout ou partie des classes d'exceptions dans la throws clause du parent méthode de classe (ou méthode substituée) ".

RemoteException hérite IOException, donc RemoteException est une classe enfant et IOEXception est une superclasse. Cela signifie que la méthode de la sous-classe (classe2) qui remplace la méthode de la classe parente (class1), qui lance IOException, peut throwRemoteException mais pas l'inverse.