为什么FileNotFoundException是Checked Exception?

时间:2015-03-06 09:47:18

标签: java exception checked

我知道FileNotFound是Checked Exception但是虽然它只是在运行时会发生这种异常。它更像是算术异常(未经检查)。

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

我的问题是为什么我们将FileNotFound/IO/DB相关内容称为Checked Exception?

请与我分享您宝贵的想法:)

5 个答案:

答案 0 :(得分:9)

仅在运行时遇到异常, 处理异常时会产生差异。

选中或取消选中表示是否在编译时强制处理它,或者仅在运行时遇到它时才会识别它。

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

在文件处理期间,编译器不会检查文件是否存在,它只是检查你是否处理过fileNotFoundException,因为一旦你处理了一个文件,遇到这个异常的可能性就很大了你应该在你的代码中处理它。 对于算术异常,在编译期间无法找到它。因此它没有被检查。

答案 1 :(得分:3)

NullPointerExceptionArithmeticException通常不应该在完成的正确程序中发生。您可以使用if检查之前是否处理这些问题,看看是否除以0或对象是null,然后您确定不会抛出此异常。每次处理这些异常都会降低代码的可读性。

现在你可以争辩说,你可以通过在做任何事情之前检查文件是否存在来为FileNotFoundException做同样的事情。但是许多期望File的构造函数或方法也支持从String创建文件。我想这是一个关于你在哪里画线的问题,如果你总是只有File方法而且从不支持String那么我也会把它添加到未经检查的那些我认为。

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

答案 2 :(得分:2)

所有异常只能在运行时发生:) transIdChecked异常之间的区别在于,编译器强制您处理Unchecked个或将它们添加到方法签名,有效地强制调用者执行相同的操作(处理/重新抛出)。

答案 3 :(得分:2)

他们让它成为Checked Exception,因为用户可以通过处理它来从这个异常中“恢复”。例如,如果发生此异常,用户可以指定不同的目录。

答案 4 :(得分:0)

Checked Exceptions强制用户明确处理它们,它们用于“可恢复的”'例外,用户可以优雅地处理这种情况。

让我们选择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将无法正常关闭,这是资源泄漏。