FileNotFoundException в Java

FileNotFoundException в Java

1. Вступление

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

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

**2. Когда выбрасывается исключение?

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

  • Файл с указанным путемdoesnot существует

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

3. Как с этим справиться?

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

Затем, что делать (связанное с бизнесом / логикой) внутри блока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, и несколько вариантов решения этой проблемы.

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