FileNotFoundException in Java

1. Inleiding

In dit artikel gaan we het hebben over een veel voorkomende uitzondering in Java: de FileNotFoundException.

We behandelen de gevallen waarin het kan voorkomen, mogelijke manieren om het te behandelen en enkele voorbeelden.

2. Wanneer wordt de uitzondering geworpen?

Zoals aangegeven in de API-documentatie van Java, kan deze uitzondering optreden als:

  • Een bestand met de opgegeven padnaam doetniet bestaan
  • Een bestand met de opgegeven padnaam doet bestaan maaris ontoegankelijk om de een of andere reden (verzocht om schrijven voor een alleen-lezen bestand, of machtigingen staan ​​geen toegang tot het bestand toe)

3. Hoe ermee om te gaan?

Allereerst rekening houdend met het feit dat het zich uitstrekt java.io.IOException dat strekt zich uit java.lang.Exception, moet je het afhandelen met een proberen te vangen blok zoals bij elke andere aangevinkte Exception.

Wat te doen (zakelijk / logisch) in het proberen te vangen block hangt eigenlijk af van wat u moet doen.

Mogelijk moet u:

  • Stel een bedrijfsspecifieke uitzondering op: dit kan een stopuitvoeringsfout zijn, maar u laat de beslissing in de bovenste lagen van de applicatie (vergeet niet de originele uitzondering op te nemen)
  • Waarschuw een gebruiker met een dialoog- of foutmelding: dit is geen stopuitvoeringsfout, dus alleen informeren is voldoende
  • Maak een bestand: een optioneel configuratiebestand lezen, het niet vinden en een nieuw maken met standaardwaarden
  • Maak een bestand in een ander pad: je moet iets schrijven en als het eerste pad niet beschikbaar is, probeer je het met een fail-safe
  • Leg gewoon een fout vast: deze fout zou de uitvoering niet moeten stoppen, maar u moet het loggen voor toekomstige analyse

4. Voorbeelden

Nu zullen we enkele voorbeelden zien, die allemaal zullen zijn gebaseerd op de volgende testklasse:

openbare klasse FileNotFoundExceptionTest {privé statische laatste Logger LOG = Logger.getLogger (FileNotFoundExceptionTest.class); private String fileName = Double.toString (Math.random ()); protected void readFailingFile () gooit IOException {BufferedReader rd = nieuwe BufferedReader (nieuwe FileReader (nieuw bestand (bestandsnaam))); rd.readLine (); // niet nodig om bestand te sluiten} class BusinessException breidt RuntimeException uit {public BusinessException (String string, FileNotFoundException ex) {super (string, ex); }}}

4.1. De uitzondering vastleggen

Als u de volgende code uitvoert, wordt de fout in de console "vastgelegd":

@Test public void logError () gooit IOException {probeer {readFailingFile (); } catch (FileNotFoundException ex) {LOG.error ("Optioneel bestand" + bestandsnaam + "is niet gevonden.", ex); }}

4.2. Een bedrijfsspecifieke uitzondering opwerpen

Vervolgens een voorbeeld van het opwerpen van een bedrijfsspecifieke uitzondering zodat de fout in de bovenste lagen kan worden afgehandeld:

@Test (verwacht = BusinessException.class) public void raiseBusinessSpecificException () gooit IOException {probeer {readFailingFile (); } catch (FileNotFoundException ex) {throw new BusinessException ("BusinessException: noodzakelijk bestand was niet aanwezig.", ex); }}

4.3. Een bestand aanmaken

Ten slotte zullen we proberen het bestand te maken zodat het kan worden gelezen (misschien voor een thread die continu een bestand aan het lezen is), maar we vangen opnieuw de uitzondering op en behandelen de mogelijke tweede fout:

@Test public void createFile () gooit IOException {probeer {readFailingFile (); } catch (FileNotFoundException ex) {probeer {nieuw bestand (bestandsnaam) .createNewFile (); readFailingFile (); } catch (IOException ioe) {throw new RuntimeException ("BusinessException: zelfs creatie is niet mogelijk.", ioe); }}}

5. Conclusie

In deze korte beschrijving hebben we gezien wanneer een FileNotFoundException kan voorkomen en verschillende opties om ermee om te gaan.

Zoals altijd staan ​​de volledige voorbeelden op Github.