Kurs Java Podstawy - rozszerzony

IOException

IOException jest wyjątkiem z grupy wyjątków osbługiwanych (checked exceptions), co oznacza, że dziedziczy bezpośredno po klasie Exception i mamy obowiązek jego obsługi, gdy jakaś metoda deklaruje go w swojej sygnaturze.

Wyjątek znajduje się w pakiecie java.io, więc pełna ścieżka do niego wygląda następująco java.io.IOException.

Wyjątek ten jest bardzo ogólny i może być wygenerowany w wielu różnych sytuacjach. Najpopularniejsze to np.:

  • nieudana próba odczytu lub zapisu do pliku związana np. z brakiem odpowiednich praw dostępu
  • próba odczytywania danych z internetu, gdy w międzyczasie utraciliśmy połączenie
  • próba odczytu danych z zamkniętego strumienia

Obsługa wyjątku w bloku try-catch

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class IoExceptionTest {

    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(new File("plik.txt")));
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
        
        try {
            br.readLine();
        } catch (IOException e) {
            System.out.println("Błąd odczytu pliku");
        }
    }

}

Utworzyliśmy BufferedReader, który pozwala nam odczytywać dane z pliku o nazwie plik.txt. W przypadku, gdy plik taki istnieje, ale próba wczytania z niego wiersza tekstu poprzez metodę readLine() się nie powiedzie np. z powodu braku dostępu do pliku, wygenerowany zostanie wyjątek IOException, który przechwytujemy w bloku catch i wyświetlamy komunikat "Błąd odczytu pliku".

Obsługa wyjątku poprzez propagację instrukcją throws.

Jeżeli nie jesteśmy w stanie w sensowny sposób obsłużyć wyjątku IOException (np. informując o nim użytkownika), to zamiast pozostawiać pusty blok catch lepiej przekazać go wyżej deklarując w metodzie odpowiedni nagłówek throws.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class IoExceptionTest {

    public static void main(String[] args) throws IOException  {
        BufferedReader br = new BufferedReader(new FileReader(new File("plik.txt")));
        br.readLine();
    }

}

Ponieważ wyjątek FileNotFoundException dziedziczy po IOException, to deklarując wyjątek IOException w naglówku metody obsługujemy jednocześnie oba z nich.

Komentarze