«1. Введение

В этой статье мы поговорим об очень распространенном исключении в Java — FileNotFoundException.

Мы рассмотрим случаи, когда это может произойти, возможные способы лечения и некоторые примеры.

2. Когда возникает исключение?

Как указано в документации API Java, это исключение может быть вызвано, когда:

    Файл с указанным путем не существует Файл с указанным путем существует, но по какой-то причине недоступен (запрошена запись для чтения) только файл, или права доступа не позволяют получить доступ к файлу)

3. Что делать?

Прежде всего, принимая во внимание, что он расширяет java.io.IOException, который расширяет java.lang.Exception, вам нужно будет иметь дело с блоком try-catch, как и с любым другим проверенным исключением.

Затем то, что делать (связанное с бизнесом/логикой) внутри блока try-catch, на самом деле зависит от того, что вам нужно сделать.

Вам может потребоваться:

    Поднять бизнес-исключение: это может быть ошибка остановки выполнения, но вы оставите решение на верхних уровнях приложения (не забудьте включить исходное исключение) Оповещение пользователя диалоговым окном или сообщением об ошибке: это не ошибка остановки выполнения, поэтому достаточно просто уведомить Создать файл: чтение необязательного файла конфигурации, не найти его и создать новый со значениями по умолчанию Создать файл в другом путь: вам нужно что-то написать, и если первый путь недоступен, попробуйте отказоустойчивый. Просто запишите ошибку: эта ошибка не должна останавливать выполнение, но вы записываете ее для будущего анализа

4. Примеры ~ ~~ Теперь мы рассмотрим несколько примеров, каждый из которых будет основан на следующем тестовом классе:

4.1. Регистрация исключения

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.2. Создание бизнес-исключения

@Test
public void logError() throws IOException {
    try {
        readFailingFile();
    } catch (FileNotFoundException ex) {
        LOG.error("Optional file " + fileName + " was not found.", ex);
    }
}

Далее пример вызова бизнес-исключения, чтобы ошибка могла быть обработана на верхних уровнях:

4.3. Создание файла

@Test(expected = BusinessException.class)
public void raiseBusinessSpecificException() throws IOException {
    try {
        readFailingFile();
    } catch (FileNotFoundException ex) {
        throw new BusinessException(
          "BusinessException: necessary file was not present.", ex);
    }
}

Наконец, мы попробуем создать файл, чтобы его можно было прочитать (возможно, для потока, который постоянно читает файл), но снова перехватив исключение и обработав возможную вторую ошибку:

~ ~~ 5. Заключение

@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);
        }
    }
}

В этом кратком обзоре мы рассмотрели, когда может возникнуть исключение FileNotFoundException, и несколько вариантов его обработки.

Как всегда, полные примеры готовы на Github.

«