FileNotFoundException i IOException w javie

0

Nie jestem pewny działania obsługi wyjątków. Jeśli napiszę, że moja metoda wyrzuca wyjątek (... throws IOException), to jest sens pisać wewnątrz tej funkcji

    try {
        in = new FileReader("plik.txt");
    }

    catch (FileNotFoundException ex) {
        System.out.println("Nie ma takiego pliku");
    }

?

FileNotFoundException dziedziczy po IOException, więc z tego, co rozumiem napisanie throws IOException powinno wystarczyć, zgadza się?
Jednak jeśli chcę, aby ten konkretny wyjątek (FileNotFoundException) został obsłużony w jakiś sposób w moim programie, mogę zrobić to w powyższy sposób?

Dodatkowo, jeżeli chciałbym uniknąć pisania "throws IOException", tylko obsłużyć ten wyjątek wewnątrz funkcji, jak mam to zrobić przy pomocy try catch, jeżeli funkcja wyrzucająca wyjątek (close()) znajduję się w bloku finally?

  try {
        in = new FileReader("plik.txt");
    }

    catch (FileNotFoundException ex) {
        System.out.println("Nie ma takiego pliku");
    }

    finally{
        if (in != null)
            in.close();
    }
1

Dodatkowo, jeżeli chciałbym uniknąć pisania "throws IOException", tylko obsłużyć ten wyjątek wewnątrz funkcji, jak mam to zrobić przy pomocy try catch, jeżeli funkcja wyrzucająca wyjątek (close()) znajduję się w bloku finally?

Można dać kolejne try w finally :

 finally {
    if (in != null) {
        try {
            in.close();
       } catch (IOException e) {
           System.out.println("Nie udało się zamknąć pliku 'plik.txt'");
           e.printStackTrace();
       }
    }
}

Ale nie jest to najlepsze rozwiązanie. Lepiej użyć try-resources.

BTW jeśli logujesz wyjątki zawsze loguj też stacktrace. Bez użycia bibliotek można to zrobić za pomocą Throwable::printStackTrace. Ale lepiej używać jakiegoś loggera, np logback

0

A czy dozwolone i sensowne będzie zostawienie throws IOException i dodanie bloku catch (FileNotFoundException ex)?
Czy raczej powinno się unikać takich konstrukcji?

2

To zależy.
Czy rzeczywiście wyjątek jest obsłużony = czyli łapiesz FileNotFound coś tam robisz i dzięki temu dalej wszystko jest ok?
Jeśli piszesz throws IOException to znaczy, że kod który wywołuje tą metodę ma ten błąd obsłużyć i błąd wynika z jego winy (tego kodu) - czyli np. parametrem twojej metody jest nazwa pliku (a ktoś wywołując ja podał nieistniejący plik).
U Ciebie raczej tak nie ma - nazwa pliku jest zaszyta - wiec deklarowanie throws IOException to błąd.

Generalnie jeśli nie wiesz co zrobić z wyjątkiem to najlepiej opakuj w RuntimeException.

catch (IOException ioe) {
  throw new RuntimeException(ioe);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1