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

时间:2011-12-06 04:10:32

标签: java

我正在阅读文档here。我正在质疑这个例子:

  

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

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

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

我从阅读中了解到,在Java中你只需要“假设”提供的文件是有效的,并使用异常处理程序抛出错误而不仅仅是检查它是否存在?或者使用Exception是一种更清晰/有效的方法来检查文件是否存在?

3 个答案:

答案 0 :(得分:3)

它可以以任何一种方式完成;更有意义取决于上下文 - 但无论如何实现,必须处理或声明要检查的异常必须被抛出。这可能会改变最有意义的东西。

我倾向于在尝试使用它之前检查文件是否存在。但例外只是 - (通常)用于特殊情况。

例如,我的应用程序检查文件是否存在,确实存在。在此之间和使用该文件之前,会出现其他内容并将其删除。现在有一个特殊情况,我的代码必须尽可能优雅地处理。

答案 1 :(得分:2)

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

 $err = do_something ($foo);
 if ($err) {
     complain ($foo, $err);
     return;
 }
 do_something_else;

你有(可以说更具可读性)?

 try {
     foo.doSomething ();
     doSomethingElse ();
 } catch (SomeException e) {
     foo.complain (e);
 }

理想情况下,您在try {}内的整个操作一目了然,catch条款可以处理一个地方的所有偏执狂。

答案 2 :(得分:0)

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

try {
    FileInputStream f = new FileInputStream(file);
    // proceed
}
catch (IOException e) {
    // report error to user
}

虽然存在一些复杂性,例如在关闭可能已成功打开或未成功打开的文件时。 Java 7有一个特殊的语法,可以更容易(称为try with resources)。

我注意到PHP代码中存在竞争条件,可能导致file_exists()调用成功,但一旦读取文件就会丢失调用。当然它可能存在但不可读。