Considérons l'interface suivante :
public interface Generator {
String generate() throws IOException;
}
et la mise en œuvre suivante :
public class EmptyStringGenerator implements Generator {
@Override
public String generate() {
return "";
}
}
Notez que j'ai omis le throws IOException
la partie de la signature spécifiée dans le Generator
interface. Pourtant, il n'y a pas d'erreur de compilation, pas d'avertissement du compilateur, pas même l'icône @Override
L'annotation se plaint.
Je suis conscient que cela fonctionne comme prévu. J'aimerais toutefois connaître l'intention qui se cache derrière cette méthode. Si ma méthode ne lance pas réellement un IOException
Je ne suis pas obligé de la retirer de la signature. Mais si je le supprime de la signature de ma méthode dans la section EmptyStringGenerator
je force toutes les sous-classes actuelles et futures de cette classe à renoncer à la possibilité de lancer une exception qui est effectivement spécifiée dans l'interface.
Pour moi, il s'agit d'une fonctionnalité qui ne présente pas vraiment d'avantages (à part l'économie de quelques frappes, ce qui n'est pas vraiment un avantage), mais qui peut être une terrible erreur lorsqu'elle est utilisée.
Donc ma question, en fait, est la suivante : Quel est l'intérêt d'omettre throws
les exceptions dans les classes dérivées ? Quel est le problème que cette possibilité résout ? Pourquoi cette possibilité est-elle autorisée ?
UPDATE
Pour les personnes qui se demandent "mais où est le mal ?", voici l'exemple tiré d'un de mes commentaires. Il n'est pas tiré par les cheveux, d'ailleurs, car c'est exactement ce à quoi je suis confronté en ce moment :
Le programmeur A spécifie l'interface I. Le programmeur B écrit la classe d'implémentation X, mais oublie d'ajouter les lancers. Il ne s'en aperçoit pas non plus, car il n'y a même pas d'avertissement lancé ici. Le programmeur C écrit la classe d'implémentation Y, héritant de la classe X, il veut même spécifiquement mettre les throws là, parce qu'il va lancer. Mais même si l'interface le stipule, il n'est maintenant plus autorisé à le faire, à cause de l'oubli de B. Il n'est effectivement plus autorisé à utiliser cette exception ici. C'est un préjudice assez important. Surtout si la classe X n'est pas sous votre contrôle.