有效的Java异常处理—是否在所有情况下都需要它?

有效的Java异常处理—是否在所有情况下都需要它?,java,Java,我正在通读文件。这个例子就是我要问的: 第一种异常是选中的异常。这些是 书面申请书应具备的特殊条件 预期并从中恢复。例如,假设一个应用程序 提示用户输入文件名,然后通过传递打开文件 java.io.FileReader的构造函数的名称。通常,用户 提供现有可读文件的名称,以便 FileReader对象的执行成功,并且 申请正常进行。但有时用户会提供 不存在文件的名称,构造函数抛出 java.io.FileNotFoundException。一个编写良好的程序会捕捉到这一点 异常并将错误通知用户,

我正在通读文件。这个例子就是我要问的:

第一种异常是选中的异常。这些是 书面申请书应具备的特殊条件 预期并从中恢复。例如,假设一个应用程序 提示用户输入文件名,然后通过传递打开文件 java.io.FileReader的构造函数的名称。通常,用户 提供现有可读文件的名称,以便 FileReader对象的执行成功,并且 申请正常进行。但有时用户会提供 不存在文件的名称,构造函数抛出 java.io.FileNotFoundException。一个编写良好的程序会捕捉到这一点 异常并将错误通知用户,可能会提示 已更正的文件名

在PHP中,在接受文件作为有效的用户输入之前,我会检查文件是否存在,例如:

    if (file_exists($file)) {
       //proceed
    } else {
       //throw error to user
    }

通过阅读本文,我是否了解到,在Java中,您只需要“假设”提供的文件是有效的,并使用异常处理程序抛出错误,而不只是检查它是否存在?或者使用异常是检查文件是否存在的一种更干净、更有效的方法吗?

我想你是对的-Java最佳实践会推荐这样的代码:

try {
    FileInputStream f = new FileInputStream(file);
    // proceed
}
catch (IOException e) {
    // report error to user
}
尽管存在一些复杂性,例如关闭可能已成功打开或未成功打开的文件。Java7有一种特殊的语法使之更容易(称为


我要注意的是,PHP代码中有一个竞争条件,它可能导致成功的
file\u exists()
调用,但一旦读取该文件,就会丢失一个调用。当然,它可能存在,但不可读。

这两种方式都可以;这取决于上下文,但不管它是如何实现的,检查的异常要么被处理,要么被声明为抛出。这可能会改变最有意义的事情

我倾向于在尝试处理文件之前检查文件是否存在。但例外情况只是——(通常)针对特殊情况


例如,我的应用程序检查文件是否存在,它确实存在。从那时起到使用该文件,会出现其他内容并将其删除。现在有一个例外情况,我的代码必须尽可能优雅地处理。

关于您的具体示例:异常处理不一定(仅仅)是验证用户输入的一种方法;它是处理
open
read
操作(隐藏在
FileInputStream
中)返回的错误(在PHP中是什么)的替代方法。可以将其视为
$err=do\u something($foo)
模型的替代方案。而不是写作

 $err = do_something ($foo);
 if ($err) {
     complain ($foo, $err);
     return;
 }
 do_something_else;
你有(可以说更可读?)


理想情况下,您在
try{}
中的整个操作一次就能看清楚,
catch
子句可以在一个地方处理所有的妄想症。

检查File.exists()的优点是,这样一个错误才是真正例外的,而不仅仅是用户的打字错误。
 try {
     foo.doSomething ();
     doSomethingElse ();
 } catch (SomeException e) {
     foo.complain (e);
 }