编译Java Servlet代码时,出现以下错误......
in javax.servlet.http.HttpServlet; overridden method does not throw org.xml.sax.SAXException
在我重写的doGet()函数中,我正在使用JAXP来处理XML,这显然需要我处理SAXExceptions。但是当我将“SAXExeption”发送到异常类型列表上时,我希望我的doGet函数能够处理,我得到了上述错误。如何让我的doGet函数挂起SAXExcpetions?
提前感谢您的帮助!
答案 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存在基本问题,用户应该获得相应的消息。