3 回答
TA贡献1871条经验 获得超8个赞
声明throws IOException
并不要求您实际抛出异常。
如果是这种情况,那么将无法编程,因为该方法的所有分支都需要抛出异常(即使在非异常情况下)。
这更像是一个拥有完整合约的问题,其中调用者可以处理可能的异常。这适用于可能被迫实际抛出异常的未来实现。
可能出于同样的原因,允许重写的方法省略已检查的异常(您不会被迫抛出它)
TA贡献1852条经验 获得超7个赞
Show Stopper 有一个很好的答案并引用了一个很好的帖子。这个答案试图帮助 OP 了解什么是受检查和未经检查的异常。
检查异常是在签名中声明的异常(无论是否抛出)。
public void doSomething() throws SomeExtremelyDevastatingEndOfTheWorldException {
// Maybe it might happen (but whoever calls this MUST acknowledge handle this case)
}
这个应用程序不会编译,因为作者认为必须处理这种情况才能运行应用程序。
未经检查的异常是不一定需要处理并且可以在运行时冒泡的异常。
public void doSomething() {
throws RuntimeException("not the end of the world...but we'll probably want this stacktrace and let the program run on");
}
现在,如果作者希望,任何异常都可以成为未经检查的异常。
TA贡献1801条经验 获得超8个赞
声明 throws IOException 不需要该方法抛出异常。
它是方法签名的一部分,也是设计软件的一部分。考虑下面的例子。Interface 中有一种方法和它的两种实现。无论是否抛出异常,两个实现都应该具有相同的签名。他们可以忽略异常条款。所以这是编译器在编译时无法显示错误的有效原因。
Interface parent {
void method() throws Exception
}
Class Implementation1 {
void method() throws Exception {
System.out.println("Do not throws exception");
}
}
Class Implementation2 {
void method() throws Exception {
throw new Exception("Error");
}
}
添加回答
举报