为什么 FileNotFoundException 是检查异常?
Why FileNotFoundException is CheckedException?
我知道 FileNotFound 是 Checked Exception,但尽管如此,只有在 运行 时间内,此异常才会 occur.It 更像是 Arithmetic Exception(Unchecked)。
无论是选中还是未选中,异常只会在运行时发生。
我的问题是为什么我们将 FileNotFound/IO/DB
相关内容称为检查异常?
请分享您的宝贵意见:)
所有异常只能在运行时发生 :) Checked
和 Unchecked
异常之间的区别在于,编译器强制您处理 checked
异常或添加它们到方法签名,有效地迫使调用者做同样的事情 (handle/rethrow).
异常总是只在运行时遇到,
处理异常时产生差异
checked or unchecked是编译时强制处理还是运行时遇到才识别
如果异常被检查意味着编译器有办法识别异常是否会发生。
并且无论何时编译它,您都将被迫处理一个已检查的异常,并且通过这样做将减少运行时异常的机会。
在文件处理过程中,编译器不会检查文件是否存在,它只是检查你是否处理过fileNotFoundException,因为一旦你处理一个文件,遇到这个异常的几率非常高,你应该在您的代码中处理它。
对于算术异常,在编译时无法找到它。因此它没有被检查。
他们让它成为一个已检查的异常,因为用户可能 "recover" 通过处理它来摆脱这个异常。例如,用户可以指定不同的目录以防发生此异常。
NullPointerException
或 ArithmeticException
通常不应出现在已完成的正确程序中。你可以处理那些只是用 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
将不会正常关闭,这就是资源泄漏。
我知道 FileNotFound 是 Checked Exception,但尽管如此,只有在 运行 时间内,此异常才会 occur.It 更像是 Arithmetic Exception(Unchecked)。
无论是选中还是未选中,异常只会在运行时发生。
我的问题是为什么我们将 FileNotFound/IO/DB
相关内容称为检查异常?
请分享您的宝贵意见:)
所有异常只能在运行时发生 :) Checked
和 Unchecked
异常之间的区别在于,编译器强制您处理 checked
异常或添加它们到方法签名,有效地迫使调用者做同样的事情 (handle/rethrow).
异常总是只在运行时遇到, 处理异常时产生差异
checked or unchecked是编译时强制处理还是运行时遇到才识别
如果异常被检查意味着编译器有办法识别异常是否会发生。 并且无论何时编译它,您都将被迫处理一个已检查的异常,并且通过这样做将减少运行时异常的机会。
在文件处理过程中,编译器不会检查文件是否存在,它只是检查你是否处理过fileNotFoundException,因为一旦你处理一个文件,遇到这个异常的几率非常高,你应该在您的代码中处理它。 对于算术异常,在编译时无法找到它。因此它没有被检查。
他们让它成为一个已检查的异常,因为用户可能 "recover" 通过处理它来摆脱这个异常。例如,用户可以指定不同的目录以防发生此异常。
NullPointerException
或 ArithmeticException
通常不应出现在已完成的正确程序中。你可以处理那些只是用 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
将不会正常关闭,这就是资源泄漏。