throws关键字仅用于检查异常。它指示调用者使用try-catch块来捕获由throws关键字列出的所有异常。
既然我们知道在我们的模块中可能会发生什么类型的检查异常,那么:
- 为什么我们不在模块内部使用try-catch块来处理检查异常?
- 我们能否在模块内部使用try-catch块来处理检查异常?
- 如果问题(2)的答案是YES,则为什么我们强制调用者使用throws关键字来捕获这些异常,而不是在模块内部捕获相同的异常?
这样我们就不必每次调用该方法时手动捕获异常。
throws关键字仅用于检查异常。它指示调用者使用try-catch块来捕获由throws关键字列出的所有异常。
既然我们知道在我们的模块中可能会发生什么类型的检查异常,那么:
这样我们就不必每次调用该方法时手动捕获异常。
java.lang.File
文件不存在时,该怎么办?由于它不知道对调用者来说什么是最好的,所以它让调用者处理此情况。FileInputStream fis = new FileInputStream("/some/path/to/file.txt");
FileNotFoundException
,你正在说,
因为
FileInputStream
显然知道它要抛出FileNotFoundException
,为什么它不自己处理呢?
FileInputStream
不知道如何处理异常!FileNotFoundException
:
FileInputStream
怎么会了解你的情况呢?它不会!throws
子句说:
我正在抛出这些异常,请自行处理。
throws IOException
添加到方法中,则无需处理它。在许多情况下,处理此类故障的唯一方法是失败,并且通常应在最外层执行。throws
并建议可能的解决方法。因此,与定义失败行为相比,开发人员的工作量非常小。interface Opener {
InputStream open(String id) throws IOException;
}
if (httpcode == 404)
throw new FileNotFoundException("Server returned a 404 error.");
但是你现在还不确定是否稍后会将其更改为不同的异常,因为它实际上不是文件。例如,您可能希望有一个网络异常的子类。但是,您可以确定您打算抛出的所有异常都将是 IOException
,因此需要该方法的用户在此级别上处理它。
openFile
方法,但文件不存在。openFile
方法无法解决这个问题,必须由用户来解决。 - Zabuzard