2009-12-01 4 views
0

Lors de la compilation mon code Java Servlet, je reçois l'erreur suivante ...Comment puis-je faire en sorte que ma classe Java Servlet gère les SAXException?

in javax.servlet.http.HttpServlet; overridden method does not throw org.xml.sax.SAXException 

Dans ma fonction surchargée doGet(), je suis en utilisant JAXP pour traiter XML qui me demande apparemment pour traiter SAXExceptions. Mais quand je tac "SAXExeption" sur la liste des types d'exception que je veux que ma fonction doGet gère, j'obtiens l'erreur ci-dessus. Comment puis-je obtenir ma fonction doGet pour accrocher SAXExcpetions?

merci d'avance pour toute votre aide!

Répondre

4

Vous ne pouvez pas déclarer une méthode de remplacement qui lève les exceptions vérifiées qui ne sont pas levées par la méthode en cours de substitution. En d'autres termes, étant donné que HttpServlet.doGet() est déclaré comme throw IOException et ServletException, vous ne pouvez pas utiliser d'autres types d'exception dans la clause throws de votre méthode doGet.

Cependant, vous pouvez conclure la SAXException que vous obtenez comme ServletException pour contourner ceci:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException { 
    try { 
     JAXP.possiblyThrowASAXException(); 
    } catch (SAXException e) { 
     throw new ServletException("JAXP had a parsing failure", e); 
    } 
} 
0

Je suis d'accord avec la réponse par Winslow @ David

Quand vous jetez une exception dans la méthode doGet d'un HttpServlet vous êtes essentiellement jeter vos mains et abandonner toute manipulation d'erreur sensible.

C'est probablement une meilleure approche pour piéger l'exception SAXException et émettre une erreur qui donne des informations utiles.

Le client vous envoie-t-il des informations dans le get qui est XML? Si c'est le cas, vous devriez probablement répondre avec une erreur sensible en leur disant que leur XML est incorrect.

Cette erreur est-elle due à un élément chargé sur le serveur? Si c'est le cas, il y a un problème de base avec get et l'utilisateur devrait recevoir un message approprié pour cela.

1

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 
     ... 
    } 
} 
+0

Ceci est une (beaucoup) meilleure explication de ce que je disais. –

Questions connexes