Lorsqu'une classe parente déclare lancer une exception vérifiée, les sous-classes doivent lancer au moins les mêmes exceptions vérifiées pour remplir le contrat de la classe parente. Dans l'autre sens, une méthode de classe enfant n'a pas besoin d'être déclarée pour lancer une exception, mais elle ne peut pas être déclarée pour lancer une exception vérifiée que la méthode de classe parente n'est pas déclarée à lancer.
Pour illustrer ceci, laisse imaginer que vous avez la classe suivante:
package test;
import java.io.IOException;
public class Parent {
void foo() throws IOException {
throw new IOException();
}
}
Ce compilerait:
package test;
class Child1 extends Parent {
void foo() {
}
}
Mais ce ne serait pas:
package test;
import org.xml.sax.SAXException;
class Child2 extends Parent
{
void foo() throws SAXException {
throw new SAXException();
}
}
Le compilateur javac
serait générer la sortie suivante:
test/Child2.java:6: foo() in test.Child2 cannot override foo() in test.Parent; overridden method does not throw org.xml.sax.SAXException
void foo() throws SAXException {
^
1 error
En d'autres termes, vous ne pouvez pas écrire ceci:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException, SAXException {
super.doGet(req, resp);
...
}
Vous devez manipuler la SAXException
dans la méthode doGet()
et de l'envelopper dans un ServletException
si vous voulez réémettre il.
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.doGet(req, resp);
try {
// code that possibly throws a SAXException
...
} catch (SAXException e) {
// handle it or rethrow it as ServletException
...
}
}
Ceci est une (beaucoup) meilleure explication de ce que je disais. –