Kurs Java Podstawy - rozszerzony

FileNotFoundException

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.

filenotfound hierarchy

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.

file not found exception konsola

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

Komentarze