我知道FileNotFound是Checked Exception但是虽然它只是在运行时会发生这种异常。它更像是算术异常(未经检查)。
无论是选中还是取消选中,都只会在运行时发生异常。
我的问题是为什么我们将FileNotFound/IO/DB
相关内容称为Checked Exception?
请与我分享您宝贵的想法:)
答案 0 :(得分:9)
仅在运行时遇到异常, 处理异常时会产生差异。
选中或取消选中表示是否在编译时强制处理它,或者仅在运行时遇到它时才会识别它。
如果检查异常,则意味着编译器有办法识别是否可以发生异常。 无论何时编译它,您都将被迫处理一个已检查的异常,并且通过这种方式可以减少运行时异常。
在文件处理期间,编译器不会检查文件是否存在,它只是检查你是否处理过fileNotFoundException,因为一旦你处理了一个文件,遇到这个异常的可能性就很大了你应该在你的代码中处理它。 对于算术异常,在编译期间无法找到它。因此它没有被检查。
答案 1 :(得分:3)
NullPointerException
或ArithmeticException
通常不应该在完成的正确程序中发生。您可以使用if
检查之前是否处理这些问题,看看是否除以0
或对象是null
,然后您确定不会抛出此异常。每次处理这些异常都会降低代码的可读性。
现在你可以争辩说,你可以通过在做任何事情之前检查文件是否存在来为FileNotFoundException
做同样的事情。但是许多期望File
的构造函数或方法也支持从String
创建文件。我想这是一个关于你在哪里画线的问题,如果你总是只有File
方法而且从不支持String
那么我也会把它添加到未经检查的那些我认为。
换句话说:如果抛出FileNotFoundException
,那么它可能是所需的行为并驱动程序流,但NullPoinerException
确实不应该用于此。
答案 2 :(得分:2)
所有异常只能在运行时发生:) transId
和Checked
异常之间的区别在于,编译器强制您处理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
将无法正常关闭,这是资源泄漏。