FileNotFoundException
Opis
FileNotFoundException jest wyjątkiem z grupy wyjątków kontrolowanych (dziedziczących po klasie Exception , ale nie RuntimeException ), co wymusza jego zgłoszenie przy pomocy instrukcji throws lub obsługę przez konstrukcję try catch.
Wyjątek ten znajduje się w pakiecie java.io więc pełna ścieżka klasy to java.io.FileNotFoundException , dziedziczy on po klasye IOException.
Typową sytuacją, kiedy wyjątek ten może wystąpić, jest próba odczytu pliku, który nie istnieje. W Javie może się to zdarzyć, gdy utworzymy obiekt File np. z błędną nazwą pliku i przed odczytem nie sprawdzimy, czy plik ten właściwie istnieje, np. przy pomocy metody exists().
Przykład
package pl.javastart.exception;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileNotFoundExceptionExample {
public static void main(String[] args) {
File file = new File("someRandomName.txt");
try {
FileReader fileReader = new FileReader(file);
BufferedReader bfReader = new BufferedReader(fileReader);
bfReader.lines().forEach(System.out::println);
bfReader.close();
} catch (FileNotFoundException e) {
System.err.println("File does not exist");
} catch (IOException e) {
System.err.println("File exists, but there was IOException");
}
}
}
W powyższym kodzie tworzymy obiekt klasy File o nazwie someRandomName.txt - zakładamy, że plik taki nie istnieje. Na tym etapie nie jest to żaden problem, jednak gdy w wierszu 14 konstruktor klasy FileReader oczekuje, że przekazany obiekt File reprezentuje istniejący plik. W naszym przypadku go nie ma, więc generowany jest wyjątek FileNotFoundException i przejście do klauzuli catch, gdzie wyświetlamy informację o błędzie.
W celu uniknięcia wygenerowania wyjątku, możemy się przed nim zabezpieczyć najpierw sprawdzając ręcznie, czy plik istnieje i dopiero wtedy próbując go odczytać.
package pl.javastart.exception;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class FileNotFoundExceptionSolvedExample {
public static void main(String[] args) throws IOException {
File file = new File("someRandomName.txt");
if (file.exists()) {
FileReader fileReader = new FileReader(file);
BufferedReader bfReader = new BufferedReader(fileReader);
bfReader.lines().forEach(System.out::println);
bfReader.close();
}
}
}
Dodanie instrukcji warunkowej if pozwala nam zabezpieczyć się przed próbą odczytu nieistniejącego pliku, jednak należy pamiętać, że ponieważ FileNotFoundException jest wyjątkiem kontrolowanym, to i tak musimy go jakoś obsłużyć. Dla czytelności możemy się jednak ograniczyć do deklaracji throws w sygnaturze metody main.
Przykłady na Github
Dyskusja i komentarze
Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.