1. 概述
在这篇文章中,我们将讨论Java中一个常见的异常——FileNotFoundException
。我们将探讨它何时会出现,如何处理,以及一些示例。
2. 异常何时抛出?
根据Java官方文档,当以下情况发生时,会抛出此异常:
- 指定路径名的文件不存在
- 指定路径名的文件存在,但因某种原因无法访问(尝试读取只读文件或权限不足)
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。