Перейти к основному содержимому

FileNotFoundException в Java

· 3 мин. чтения

1. Введение

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

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

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

Как указано в документации API 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 .