FileNotFoundException i Java

1. Introduktion

I denne artikel vil vi tale om en meget almindelig undtagelse i Java - FileNotFoundException.

Vi dækker de tilfælde, hvor det kan forekomme, mulige måder at behandle det på og nogle eksempler.

2. Hvornår kastes undtagelsen?

Som angivet i Java's API-dokumentation kan denne undtagelse kastes, når:

  • En fil med det angivne stinavn gørikke eksisterer
  • En fil med det angivne stinavn gør eksisterer mener utilgængelig af en eller anden grund (anmodet om skrivning til en skrivebeskyttet fil eller tilladelser tillader ikke adgang til filen)

3. Hvordan håndteres det?

Først og fremmest under hensyntagen til, at det strækker sig java.io.IOUndtagelse der strækker sig java.lang.Undtagelse, skal du håndtere det med en prøve-fangst blokere som med alle andre kontrollerede Exception.

Så hvad skal man gøre (forretning / logik relateret) inde i prøve-fangst blok afhænger faktisk af, hvad du skal gøre.

Du skal muligvis:

  • Forøg en forretningsspecifik undtagelse: dette kan være en stopkørselsfejl, men du vil efterlade beslutningen i de øverste lag i applikationen (glem ikke at medtage den oprindelige undtagelse)
  • Alarmer en bruger med en dialog eller en fejlmeddelelse: dette er ikke en stop-eksekveringsfejl, så det er nok bare at give besked
  • Opret en fil: at læse en valgfri konfigurationsfil, ikke finde den og oprette en ny med standardværdier
  • Opret en fil i en anden sti: du skal skrive noget, og hvis den første sti ikke er tilgængelig, skal du prøve med en fejlsikker en
  • Bare log en fejl: denne fejl skal ikke stoppe udførelsen, men du logger den til fremtidig analyse

4. Eksempler

Nu ser vi nogle eksempler, som alle vil være baseret på følgende testklasse:

offentlig klasse FileNotFoundExceptionTest {privat statisk endelig Logger LOG = Logger.getLogger (FileNotFoundExceptionTest.class); private String fileName = Double.toString (Math.random ()); beskyttet ugyldigt readFailingFile () kaster IOException {BufferedReader rd = ny BufferedReader (ny FileReader (ny fil (filnavn))); rd.readLine (); // intet behov for at lukke fil} klasse BusinessException udvider RuntimeException {public BusinessException (strengstreng, FileNotFoundException ex) {super (streng, ex); }}}

4.1. Logning af undtagelsen

Hvis du kører følgende kode, "logger" den fejlen i konsollen:

@Test offentlig ugyldig logError () kaster IOException {prøv {readFailingFile (); } fange (FileNotFoundException ex) {LOG.error ("Valgfri fil" + filnavn + "blev ikke fundet.", ex); }}

4.2. At hæve en forretningsspecifik undtagelse

Dernæst et eksempel på at hæve en forretningsspecifik undtagelse, så fejlen kan håndteres i de øverste lag:

@Test (forventet = BusinessException.class) offentlig ugyldig raiseBusinessSpecificException () kaster IOException {prøv {readFailingFile (); } catch (FileNotFoundException ex) {throw new BusinessException ("BusinessException: nødvendig fil var ikke til stede.", ex); }}

4.3. Oprettelse af en fil

Endelig forsøger vi at oprette filen, så den kan læses (måske for en tråd, der kontinuerligt læser en fil), men igen fanger undtagelsen og håndterer den mulige anden fejl:

@Test offentlig ugyldighed createFile () kaster IOException {prøv {readFailingFile (); } fange (FileNotFoundException ex) {prøv {ny fil (filnavn) .createNewFile (); readFailingFile (); } fange (IOException ioe) {kast ny RuntimeException ("BusinessException: selv oprettelse er ikke mulig.", ioe); }}}

5. Konklusion

I denne hurtige opskrivning har vi set, hvornår en FileNotFoundException kan forekomme, og flere muligheder for at håndtere det.

Som altid er de fulde eksempler overstået på Github.