1. 概述
在本文中,我们将讨论Java中一个非常常见的异常-FileNotFoundException。
我们将介绍可能发生的情况、可能的处理方法和一些示例。
2. 什么时候抛出异常?
如Java的API文档所示,在以下情况下会抛出此异常:
- 具有指定路径名的文件不存在
- 具有指定路径名的文件确实存在但由于某种原因无法访问(请求写入只读文件,或者权限不允许访问该文件)
3. 如何处理?
首先,考虑到它扩展了java.io.IOException,扩展了java.lang.Exception,你将需要像处理任何其他受检异常一样使用try-catch块来处理它。
然后,在try-catch块中做什么(业务/逻辑相关)实际上取决于你需要做什么。
你可能需要:
- 引发特定于业务的异常:这可能是一个停止执行的错误,但你会把决定权留在应用程序的上层(不要忘记包含原始异常)
- 通过对话框或错误消息提醒用户:这不是停止执行错误,因此只需通知就足够了
- 创建一个文件:读取一个可选的配置文件,而不是找到它并使用默认值创建一个新配置文件
- 在另一个路径中创建一个文件:你需要写一些东西,如果第一个路径不可用,则尝试使用故障安全路径
- 只记录一个错误:这个错误不应该停止执行,但你记录它以供将来分析
4. 例子
现在我们将看到一些示例,所有示例都将基于以下测试类:
public class FileNotFoundExceptionTest {
private static final Logger LOG = Logger.getLogger(FileNotFoundExceptionTest.class);
private String fileName = Double.toString(Math.random());
protected void readFailingFile() throws IOException {
BufferedReader rd = new BufferedReader(new FileReader(new File(fileName)));
rd.readLine();
// no need to close file
}
class BusinessException extends RuntimeException {
public BusinessException(String string, FileNotFoundException ex) {
super(string, ex);
}
}
}
4.1 记录异常
如果运行以下代码,它将在控制台中“记录”错误:
@Test
public void logError() throws IOException {
try {
readFailingFile();
} catch (FileNotFoundException ex) {
LOG.error("Optional file " + fileName + " was not found.", ex);
}
}
4.2 引发业务特定异常
接下来,举一个业务特定异常的例子,以便可以在上层处理错误:
@Test(expected = BusinessException.class)
public void raiseBusinessSpecificException() throws IOException {
try {
readFailingFile();
} catch (FileNotFoundException ex) {
throw new BusinessException("BusinessException: necessary file was not present.", ex);
}
}
4.3 创建文件
最后,我们将尝试创建文件以便读取它(可能是对于一个连续读取文件的线程),但再次捕获异常并处理可能的第二个错误:
@Test
public void createFile() throws IOException {
try {
readFailingFile();
} catch (FileNotFoundException ex) {
try {
new File(fileName).createNewFile();
readFailingFile();
} catch (IOException ioe) {
throw new RuntimeException("BusinessException: even creation is not possible.", ioe);
}
}
}
5. 总结
在这篇简短的文章中,我们了解了何时会发生FileNotFoundException以及处理它的几个选项。
与往常一样,本教程的完整源代码可在GitHub上获得。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章