如何让我的Java Servlet类处理SAXException?

时间:2009-12-01 05:10:51

标签: java xml

编译Java Servlet代码时,出现以下错误......

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

在我重写的doGet()函数中,我正在使用JAXP来处理XML,这显然需要我处理SAXExceptions。但是当我将“SAXExeption”发送到异常类型列表上时,我希望我的doGet函数能够处理,我得到了上述错误。如何让我的doGet函数挂起SAXExcpetions?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

您无法声明一个重写方法,该方法会抛出被覆盖的方法不会抛出的已检查异常。换句话说,由于HttpServlet.doGet()被声明为抛出IOException和ServletException,因此您不能在doGet方法的throws子句中使用任何其他异常类型。

但是,您可以将作为ServletException获取的SAXException包装起来以解决此问题:

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

答案 1 :(得分:1)

当父类声明抛出已检查的异常时,子类必须至少抛出相同的已检查异常以完成父类的约定。反过来说,子类方法不必声明为抛出任何异常,但不能声明它抛出一个未声明父类方法抛出的已检查异常。

为了说明这一点,我们假设您有以下类:

package test;

import java.io.IOException;

public class Parent {
    void foo() throws IOException {
        throw new IOException();
    }
}

这将编译:

package test;

class Child1 extends Parent {
    void foo() {
    }
}

但这不会:

package test;

import org.xml.sax.SAXException;

class Child2 extends Parent
{
    void foo() throws SAXException {
        throw new SAXException();
    }
}

javac编译器将生成以下输出:

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

换句话说,你不能这样写:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException, SAXException {
    super.doGet(req, resp);
    ...
}

您必须处理SAXException方法中的doGet()并将其包装在ServletException中,如果您想重新抛出它。

@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
        ...
    }
}

答案 2 :(得分:0)

我同意@David Winslow的回答

当你在HttpServlet的doGet方法中抛出异常时,你实际上是在抛弃你的手并放弃任何合理的错误处理。

它可能是捕获SAXException并发出错误的更好方法,它提供了有用的信息。

客户端是否在get中发送了哪些信息是XML?如果是,您应该回答一个明智的错误,告诉他们他们的XML不正确。

这个错误是由服务器端加载的东西引起的吗?如果是,则get存在基本问题,用户应该获得相应的消息。