Sobes.tech
Junior

Kaip Java apdorojamos klaidos ir kaip su jomis dirbti?

sobes.tech AI

Atsakymas iš AI

Java klaidos tvarkomos naudojant išimčių mechanizmą. Išimtys yra įvykiai, kurie pažeidžia programos įprastą vykdymo eigą. Yra du išimčių tipai: Checked Exceptions ir Unchecked Exceptions.

Checked Exceptions:

  • Paveldi iš java.lang.Exception (išskyrus RuntimeException).
  • Privalo būti apdorotos (naudojant try-catch) arba deklaruotos metodo paraše (naudojant throws).
  • Atstovauja klaidas, kurios gali įvykti įprastomis sąlygomis (pvz., IOException, FileNotFoundException).

Unchecked Exceptions:

  • Paveldi iš java.lang.RuntimeException arba java.lang.Error.
  • Nereikalauja privalomo apdorojimo ar deklaravimo.
  • Atstovauja klaidas, kurios dažnai rodo loginės klaidos kode arba nestandartines vykdymo aplinkos būsenas (pvz., NullPointerException, ArrayIndexOutOfBoundsException).

Išimčių apdorojimas:

Naudojami try-catch-finally blokai:

  • try: Kodo blokas, kuris gali sukelti išimtį.
  • catch: Kodo blokas, kuris vykdomas, jei try bloke įvyksta nurodyto tipo išimtis.
  • finally: Kodo blokas, kuris vykdomas nepriklausomai nuo to, ar įvyko išimtis ar ne. Dažnai naudojamas išteklių atlaisvinimui.
try {
    // Kodas, kuris gali sukelti išimtį
    int result = 10 / 0; // Pavyzdys: ArithmeticException
} catch (ArithmeticException e) {
    // ArithmeticException apdorojimas
    System.err.println("Dalyba iš nulio klaida: " + e.getMessage());
} catch (Exception e) {
    // Bet kokios kitos išimties apdorojimas
    System.err.println("Bendra klaida: " + e.getMessage());
} finally {
    // Kodo blokas, kuris visada vykdomas
    System.out.println("Finally blokas įvykdytas.");
}

Išimčių perdavimas:

Metodas gali deklaruoti, kad jis gali sukelti tam tikrą išimtį, naudojant throws žodį:

public void readFile(String filePath) throws FileNotFoundException, IOException {
    // Failo skaitymo kodas
    FileReader fr = new FileReader(filePath);
    // Jei failas nerandamas, gali būti išmesta `FileNotFoundException`
    // Jei įvyksta įvesties/išvesties klaida, gali būti išmesta `IOException`
    // ...
}

Kvietimo metodas turi arba apdoroti šią išimtį (try-catch), arba taip pat ją perduoti.

Sukurti savo išimtis:

Galite sukurti savo išimtis, paveldėdami iš Exception (Checked Exceptions) arba RuntimeException (Unchecked Exceptions).

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

Naudojimas:

public void processData(int value) throws MyCustomException {
    if (value < 0) {
        throw new MyCustomException("Reikšmė negali būti neigiama");
    }
    // Duomenų apdorojimas
}

Pagrindinės išimčių klasės (hierarchija):

  • java.lang.Throwable (visų klaidų ir išimčių bazinis klasas)
    • java.lang.Error (rimtų problemų, kurios dažniausiai nėra apdorojamos programos, pvz., OutOfMemoryError)
    • java.lang.Exception (klaidų, kurias programa gali apdoroti)
      • java.lang.RuntimeException (Unchecked Exceptions)
        • NullPointerException
        • ArrayIndexOutOfBoundsException
        • ArithmeticException
        • ir kt.
      • Kiti Exception pogrupiai
        • IOException
        • FileNotFoundException
        • SQLException
        • ir kt.

Darbas su klaidomis apima šios hierarchijos supratimą, tinkamo išimties tipo pasirinkimą (sukuriant savo), efektyvų try-catch-finally naudojimą išimčių apdorojimui ir perdavimui, taip pat klaidų logavimą klaidų šalinimui.