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