Java 无ServletException的Serlvet的init方法
尽管ServletException是一个已检查的异常,但我可以通过扩展HttpServlet并创建一个init方法来创建一个Servlet,而无需抛出或捕获ServletException。编译器没有抱怨,Servlet也能正常工作 这是怎么回事。 mC的签名是mA签名的子签名(§8.4.2) 其中定义为 两个方法或构造函数,M和N,如果它们 具有相同的名称、相同的类型参数(如有)(§8.4.4),以及, 在使N的形式参数类型适应该类型之后 M的参数,形式参数类型相同 方法m1的签名是方法m1的签名的子签名 方法m2,如果:Java 无ServletException的Serlvet的init方法,java,exception,servlets,Java,Exception,Servlets,尽管ServletException是一个已检查的异常,但我可以通过扩展HttpServlet并创建一个init方法来创建一个Servlet,而无需抛出或捕获ServletException。编译器没有抱怨,Servlet也能正常工作 这是怎么回事。 mC的签名是mA签名的子签名(§8.4.2) 其中定义为 两个方法或构造函数,M和N,如果它们 具有相同的名称、相同的类型参数(如有)(§8.4.4),以及, 在使N的形式参数类型适应该类型之后 M的参数,形式参数类型相同 方法m1的签名是方法m1
- m2与m1具有相同的签名,或
- m1的签名与m2签名的删除(§4.6)相同
throws
子句。但是,
- 如果m2有一个throws子句,其中提到任何选中的异常类型, 那么m1必须有一个throws子句,否则会发生编译时错误
- 对于m2的TROWS子句中列出的每个选中的异常类型, 相同的异常类或其超类型之一必须出现在 删除m1中的条款(§4.6);否则,编译时 发生错误
class Bar {
public void method() throws Exception {}
}
class Foo extends Bar {
@Override
public void method() {}
}
如果你这样做
Bar bar = new Foo();
bar.method(); // you'll need to handle it, but it will never happen
Foo foo = new Foo();
foo.method(); // you don't need to handle, it still won't ever happen
但情况正好相反
class Bar {
public void method() throws SomeCheckedException{}
}
class Foo extends Bar {
@Override
public void method() throws SomeOtherUnrelatedCheckedException{}
}
将失败
Bar bar = new Foo();
bar.method(); // Bar says some exception can happen, but the actual object may throw another, it wouldn't be handled.
当使用
throws ServletException
这并不意味着它必须抛出ServletException。这意味着它可以抛出一个ServletException。因此,如果您的方法从未抛出ServletException,那就好了。如果您的
init()
方法抛出了ServletException以外的另一种类型的已检查异常,那么就不好了。告诉我们您做了什么。