Sobes.tech
Junior

Ako sa v Jave spracovávajú chyby a ako s nimi pracovať?

sobes.tech AI

Odpoveď od AI

V Jave sa chyby spracúvajú pomocou mechanizmu výnimiek. Výnimky predstavujú udalosti, ktoré narušujú bežný priebeh vykonávania programu. Existujú dva typy výnimiek: Checked Exceptions a Unchecked Exceptions.

Checked Exceptions:

  • Dediť od java.lang.Exception (okrem RuntimeException).
  • Musia byť spracované (pomocou try-catch) alebo deklarované v signatúre metódy (pomocou throws).
  • Predstavujú chyby, ktoré sa môžu vyskytnúť za bežných podmienok (napríklad IOException, FileNotFoundException).

Unchecked Exceptions:

  • Dediť od java.lang.RuntimeException alebo java.lang.Error.
  • Nevyžadujú povinné spracovanie alebo deklaráciu.
  • Predstavujú chyby, ktoré často poukazujú na logické chyby v kóde alebo neštandardné stavy prostredia behu (napríklad NullPointerException, ArrayIndexOutOfBoundsException).

Spracovanie výnimiek:

Na spracovanie výnimiek sa používajú bloky try-catch-finally:

  • try: Blok kódu, ktorý môže generovať výnimku.
  • catch: Blok kódu, ktorý sa vykoná, ak v bloku try nastane výnimka daného typu. Môže byť viacero catch blokov pre rôzne typy výnimiek.
  • finally: Blok kódu, ktorý sa vykoná bez ohľadu na to, či došlo k výnimke alebo nie. Často sa používa na uvoľnenie zdrojov (napríklad zatváranie súborov, spojení).
try {
    // Kód, ktorý môže spôsobiť výnimku
    int result = 10 / 0; // Príklad: ArithmeticException
} catch (ArithmeticException e) {
    // Spracovanie ArithmeticException
    System.err.println("Chyba delenia nulou: " + e.getMessage());
    // Môže sa logovať chyba, zobrazovať správa používateľovi atď.
} catch (Exception e) {
    // Spracovanie akejkoľvek inej výnimky, ak nebola spracovaná skôr
    System.err.println("Všeobecná chyba: " + e.getMessage());
} finally {
    // Kód, ktorý sa vykoná vždy
    System.out.println("Blok finally bol vykonaný.");
}

Prehadzovanie výnimiek:

Metóda môže deklarovať, že môže generovať určitú výnimku, pomocou kľúčového slova throws:

public void readFile(String filePath) throws FileNotFoundException, IOException {
    // Kód na čítanie súboru
    // Ak súbor nie je nájdený, môže byť vyhodená výnimka FileNotFoundException (podtrieda IOException)
    FileReader fr = new FileReader(filePath);
    // Ak dôjde k chybe vstupu/výstupu, môže byť vyhodená IOException
    // ...
}

Volajúca metóda musí buď spracovať túto výnimku (try-catch), alebo ju tiež deklarovať, že ju prehadzuje.

Vytváranie vlastných výnimiek:

Môžete vytvoriť vlastné triedy výnimiek, dediace od Exception (pre Checked Exceptions) alebo RuntimeException (pre Unchecked Exceptions).

public class MyCustomException extends Exception {
    public MyCustomException(String message) {
        super(message);
    }
}

Použitie:

public void processData(int value) throws MyCustomException {
    if (value < 0) {
        throw new MyCustomException("Hodnota nemôže byť záporná");
    }
    // Spracovanie dát
}

Hlavné triedy výnimiek (hierarchia):

  • java.lang.Throwable (základná trieda pre všetky chyby a výnimky)
    • java.lang.Error (pre vážne problémy, ktoré sa zvyčajne nespracovávajú programom, napríklad OutOfMemoryError)
    • java.lang.Exception (pre výnimky, ktoré program môže spracovať)
      • java.lang.RuntimeException (Unchecked Exceptions)
        • NullPointerException
        • ArrayIndexOutOfBoundsException
        • ArithmeticException
        • atď.
      • Iné podtriedy Exception (Checked Exceptions)
        • IOException
        • FileNotFoundException
        • SQLException
        • atď.

Práca s chybami zahŕňa pochopenie tejto hierarchie, výber vhodného typu výnimky (pri tvorbe vlastných), efektívne použitie try-catch-finally na spracovanie a prehadzovanie výnimiek, ako aj logovanie chýb na účely ladenia.