尝试/捕获异常或使用 if 语句来处理不同的结果更好吗?
为了方便,我正在用 Java 编写一个简短的程序来复制文件,并使用 ifs 来处理文件不存在的事件,并为每个方法声明 throws,但不要使用 try/catch。
我应该返回并用 try/catch 替换那些 if 和相关部分,还是这种“可接受的”编程“用于与一小群用户共享?
尝试/捕获异常或使用 if 语句来处理不同的结果更好吗?
为了方便,我正在用 Java 编写一个简短的程序来复制文件,并使用 ifs 来处理文件不存在的事件,并为每个方法声明 throws,但不要使用 try/catch。
我应该返回并用 try/catch 替换那些 if 和相关部分,还是这种“可接受的”编程“用于与一小群用户共享?
如果丢失,您的意思是该文件应该始终存在,那么这是一个例外。
如果您的意思是丢失的文件是普通的(可能甚至很可能)发生,那么不要使用异常。
在将输入传递给函数之前检查输入的有效性(并处理错误输入)通常是一种很好的设计。这通常会导致更容易阅读和更清晰的代码。
然而,现实情况是,在这种情况下,无论在尝试复制之前进行了多少检查,您都可能需要处理错误的输入,这是因为即使您事先检查了文件是否存在,它也可能在以后被删除,或者可能会发生另一个 IO 错误。
处理丢失文件的唯一真正安全的方法是处理异常。考虑一下:
if (file.exists() && file.canRead()) {
try {
is = new FileInputStream(file);
} catch (IOException ex) {
// Never happens
}
}
事实上,“从未发生”的情况可能会发生。例如:
如果file
实际上是一个目录,则打开将失败。(您可以通过调用 来处理file.isDirectory()
,但还有其他情况很难处理......比如在易碎的可移动介质上创建文件。)
假设某个外部应用程序在该应用程序测试文件和尝试打开它之间的小窗口中删除了文件或更改了它的权限。根本没有办法处理这种竞争条件......
此外,这些测试中的每一个都可能是一个系统调用。系统调用很昂贵——大致与创建/抛出/捕获异常一样昂贵。
因此,在打开文件时处理 IO 异常可能性的最佳方法是让它们发生。无论如何,使用File
API 来帮助诊断问题,但不要依赖它来避免 IO 异常。