假如你这样做:
Scanner scanner = new Scanner(new File("/file/does/not/exist"));
和构造函数抛出FileNotFoundException。首先要注意的是,构造函数不返回Scanner对象。相反,new表达式将异常终止,并且将不会发生对scanner的分配。控制最终会在某些处理程序中结束,但由于超出范围,因此无法参考scanner。
因此,要回答你的问题:
如果错误确实得到投掷,并扫描对象得到封闭,或者我还是得做,当我处理异常?
如果FileNotFoundException由构造抛出,没有Scanner对象close() ...所以你不必关闭它。
但是,根据您编写代码的方式,您可能会到达处理程序或代码块,而无需知道是否抛出了异常,是否抛出构造函数或构造函数完成后抛出异常。处理这个问题的方式取决于您使用的Java版本。在Java 7之前,这个成语就像@ Sangeeth的答案。对于Java 7和更高版本,你可以这样写:
try (Scanner scanner = new Scanner(new File(path))) {
//your code here
} catch (FileNotFoundException e) {
//log it
}
注意“尝试与 - 资源”的语法有一个隐含的finally是每个在的开始宣布(autocloseable)资源的自动调用close()try。这可以免除您对在各种可能的成功和失败情况下关闭资源的繁琐代码的责任。
事实上,我们可以把这个层面做得更深一层。 Scanner构造函数调用FileInputStream来打开该文件,这就是FileNotFoundException将被抛出的地方。反过来,这将通过调用本地open方法实际打开文件。如果在这个过程中出现问题(并抛出异常),那么在允许异常传播之前,构造者有责任确保释放任何资源(例如,本地流被关闭)。
它必须以这种方式工作,因为失败的构造函数不会返回任何东西,并且他们不能依赖更深层次的东西知道如何释放特定异常处理程序中的资源。