如何使我的Java Servlet类处理SAXException';s

如何使我的Java Servlet类处理SAXException';s,java,xml,Java,Xml,编译Java Servlet代码时,出现以下错误 in javax.servlet.http.HttpServlet; overridden method does not throw org.xml.sax.SAXException 在我重写的doGet()函数中,我使用JAXP处理XML,这显然需要我处理SAXP异常。但是当我将“SAXExeption”添加到我希望doGet函数处理的异常类型列表中时,我得到了上面的错误。如何让我的doGet函数挂起萨克斯管 提前感谢您的帮助 不能声明一个

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

in javax.servlet.http.HttpServlet; overridden method does not throw org.xml.sax.SAXException
在我重写的doGet()函数中,我使用JAXP处理XML,这显然需要我处理SAXP异常。但是当我将“SAXExeption”添加到我希望doGet函数处理的异常类型列表中时,我得到了上面的错误。如何让我的doGet函数挂起萨克斯管


提前感谢您的帮助

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

但是,您可以将获得的SAXException打包为ServletException,以解决以下问题:

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

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

但是,您可以将获得的SAXException打包为ServletException,以解决以下问题:

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

我同意大卫·温斯洛的回答

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

捕获SAXException并发出一个提供有用信息的错误可能是更好的方法

客户机是否在get(即XML)中向您发送信息?如果是这样的话,您可能应该以一个合理的错误作为响应,告诉他们他们的XML不正确


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

我同意@David Winslow的回答

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

捕获SAXException并发出一个提供有用信息的错误可能是更好的方法

客户机是否在get(即XML)中向您发送信息?如果是这样的话,您可能应该以一个合理的错误作为响应,告诉他们他们的XML不正确


此错误是由服务器端加载的内容引起的吗?如果是这样,那么get就有一个基本问题,用户应该得到相应的消息。

当父类声明抛出一个选中的异常时,子类必须抛出至少相同的选中的异常,以满足父类的约定。另一方面,子类方法不必声明为引发任何异常,但不能声明为引发父类方法未声明为引发的已检查异常

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

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);
    ...
}
如果要重新播放,必须在
doGet()
方法中处理
SAXException
,并将其包装在
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
        ...
    }
}

当父类声明抛出已检查异常时,子类必须至少抛出相同的已检查异常以满足父类的约定。另一方面,子类方法不必声明为引发任何异常,但不能声明为引发父类方法未声明为引发的已检查异常

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

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);
    ...
}
如果要重新播放,必须在
doGet()
方法中处理
SAXException
,并将其包装在
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
        ...
    }
}
这是对我所说的更好的解释。