Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
抛出异常时java扫描程序是否关闭?_Java_Exception Handling - Fatal编程技术网

抛出异常时java扫描程序是否关闭?

抛出异常时java扫描程序是否关闭?,java,exception-handling,Java,Exception Handling,如果我有一个抛出FilenotFoundException的方法,因为我正在使用Scanner对象读取文件,那么如果错误确实被抛出,Scanner对象是否会关闭,或者我在处理异常时是否仍必须这样做 我知道,当我在方法中使用try-catch-finally块写入来处理异常时,我会关闭scanner对象,但如果我必须在另一个捕获异常的对象中的方法中执行此操作,我将无法访问scanner对象 请保持简单的解释…显然我对java(以及一般的OO)是新手。如果在执行新建扫描程序(文件)时找不到文件,则根

如果我有一个抛出FilenotFoundException的方法,因为我正在使用Scanner对象读取文件,那么如果错误确实被抛出,Scanner对象是否会关闭,或者我在处理异常时是否仍必须这样做

我知道,当我在方法中使用try-catch-finally块写入来处理异常时,我会关闭scanner对象,但如果我必须在另一个捕获异常的对象中的方法中执行此操作,我将无法访问scanner对象


请保持简单的解释…显然我对java(以及一般的OO)是新手。

如果在执行
新建扫描程序(文件)
时找不到文件,则根本的
FileInputStream
甚至不会打开

关闭finally块中的扫描仪是一个很好的做法。如果扫描仪已关闭,则关闭调用将无效


或者您可以尝试
try with resources
构造,如果出现异常,该构造将自动关闭资源。

我想您应该在finally块中关闭scanner对象,无论是否捕获异常。

如果您使用这样的代码
Scanner Scanner=新的扫描仪(新文件(“C:/abc.txt”)
若它抛出异常,
扫描仪
对象本身将不会被创建,所以无需关闭它

但是最好的编码方式如下所示。你可以在最后一个街区靠近

Scanner scanner=null;
try
{
    scanner = new Scanner(new File(path));
    //your code here
}
catch(FileNotFoundException e)//either catch or throw out
{
   //log it
}
finally
{
    if(null !=scanner)
    {
        scanner.close();
    }
 }
假设您这样做:

  Scanner scanner = new Scanner(new File("/file/does/not/exist"));
构造函数抛出
FileNotFoundException
。首先要注意的是,构造函数不返回
Scanner
对象。相反,
new
表达式将异常终止,并且不会发生对
scanner
的赋值。控件最终将出现在异常的某个处理程序中,该异常将无法引用
scanner
,因为它超出了范围

所以要回答你的问题:

如果错误真的被抛出,扫描器对象是否会关闭,或者在处理异常时是否仍必须关闭

如果构造函数抛出了
FileNotFoundException
,则没有
Scanner
对象来
close()
。。。所以你不需要关闭它

但是,根据编写代码的方式,您可能会到达处理程序或
最终
块,而不知道是否引发了异常,是否在构造函数中引发,或者在构造函数完成后引发。处理这种情况的方法取决于您使用的Java版本。在Java7之前,这个习语类似于@Sangeeth的答案。对于Java 7及更高版本,您可以编写以下代码:

try (Scanner scanner = new Scanner(new File(path))) {
    //your code here
} catch (FileNotFoundException e) {
    //log it
}
请注意,“try with resources”语法有一个隐式的
finally
,它会自动调用
close()
,对
try
开头声明的每个(自动关闭的)资源进行调用。这免除了您在各种可能的成功和失败案例中关闭资源的复杂代码的责任


事实上,我们可以更深入地了解这一点。
Scanner
构造函数调用
FileInputStream
打开文件,这就是抛出FileNotFoundException的地方。反过来,这将调用本机的
open
方法来实际打开文件。如果在此过程中出现错误(并引发异常),则构造函数有责任确保在允许异常传播之前释放所有资源(例如,关闭本机流)


它必须以这种方式工作,因为失败的构造函数不会返回任何内容,而且他们不能依赖于更高层次的东西,知道如何在特定的异常处理程序中释放资源。

尝试使用资源
似乎是最好的方法,因为它需要更少的资源code@superbob这是最好的方法,原因不仅仅是“代码更少”:。