为什么 FileNotFoundException 是检查异常?

Why FileNotFoundException is CheckedException?

我知道 FileNotFound 是 Checked Exception,但尽管如此,只有在 运行 时间内,此异常才会 occur.It 更像是 Arithmetic Exception(Unchecked)。

无论是选中还是未选中,异常只会在运行时发生。

我的问题是为什么我们将 FileNotFound/IO/DB 相关内容称为检查异常?

请分享您的宝贵意见:)

所有异常只能在运行时发生 :) CheckedUnchecked 异常之间的区别在于,编译器强制您处理 checked 异常或添加它们到方法签名,有效地迫使调用者做同样的事情 (handle/rethrow).

异常总是只在运行时遇到, 处理异常时产生差异

checked or unchecked是编译时强制处理还是运行时遇到才识别

如果异常被检查意味着编译器有办法识别异常是否会发生。 并且无论何时编译它,您都将被迫处理一个已检查的异常,并且通过这样做将减少运行时异常的机会。

在文件处理过程中,编译器不会检查文件是否存在,它只是检查你是否处理过fileNotFoundException,因为一旦你处理一个文件,遇到这个异常的几率非常高,你应该在您的代码中处理它。 对于算术异常,在编译时无法找到它。因此它没有被检查。

他们让它成为一个已检查的异常,因为用户可能 "recover" 通过处理它来摆脱这个异常。例如,用户可以指定不同的目录以防发生此异常。

NullPointerExceptionArithmeticException 通常不应出现在已完成的正确程序中。你可以处理那些只是用 if 之前检查,看看你是否除以 0 或者一个对象是 null 然后你确定这个异常不会被抛出。每次处理这些异常都会降低代码的可读性。

现在您可以争辩说,您可以通过在执行任何操作之前检查文件是否存在来为 FileNotFoundException 执行相同的操作。但是许多期望 File 的构造函数或方法也支持 String 然后从中创建文件。我想这是一个你在哪里画线的问题,如果你总是只有 File 方法并且从不支持 String 那么我想我也会将它添加到未选中的方法中。

换句话说:如果抛出 FileNotFoundException 那么它可能是所需的行为并驱动程序的流程,但 NullPoinerException 真的不应该用于此。

Checked Exceptions 强制用户显式处理它们,它们用于 'recoverable' 异常,用户可以从容地处理这种情况。

让我们来看一个 FileNotFound - 它通常在文件不存在时抛出,下面是相关的编程习惯用法:

FileInputStream fis = null;
try {
    fis = new FileInputStream(new File(""));
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    try {
        fis.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

此处的 Checked Exception 强制我在 try/catch 块中声明它,即使出现异常我也可以在其中优雅地关闭 fis

现在考虑 FileNotFound 是一个运行时异常,代码假设如下所示:

FileInputStream fis = null;
fis = new FileInputStream(new File(""));
fis.close();

现在,如果这抛出运行时异常 - 您不需要在编译时处理,您的 fis 将不会正常关闭,这就是资源泄漏。