FileNotFoundException в Java

1. Въведение

В тази статия ще говорим за много често срещано изключение в Java - FileNotFoundException .

Ще разгледаме случаите, когато това може да се случи, възможните начини за лечение и някои примери.

2. Кога се хвърля изключението?

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

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

3. Как да се справим?

На първо място, като се вземе предвид, че той разширява java.io.IOException, който разширява java.lang.Exception , ще трябва да се справите с него с try-catch блок, както с всяко друго проверено E xception .

Тогава какво да правите (свързано с бизнес / логика) в блока 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.