FileNotFoundException i IOException w javie

FileNotFoundException i IOException w javie
H5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 66
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();
    }
KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5549
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 :

Kopiuj
 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

H5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 66
0

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

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
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.

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.