Sobes.tech
Junior

Kuidas Java-s käsitletakse vigu ja kuidas nendega töötada?

sobes.tech AI

Vastus AI-lt

Java vigade töödeldakse erandimehhanismi kasutades. Erandid on sündmused, mis katkestavad programmi normaalse täitmise voolu. On kaks tüüpi erandeid: Checked Exceptions ja Unchecked Exceptions.

Checked Exceptions:

  • pärivad java.lang.Exception-ist (välja ar RuntimeException).
  • Peavad olema töödeldud (kasutades try-catch) või deklareeritud meetodi signatuuris (kasutades throws).
  • Esindavad vigu, mis võivad tekkida tavatingimustes (näiteks IOException, FileNotFoundException).

Unchecked Exceptions:

  • pärivad java.lang.RuntimeException või java.lang.Error.
  • Ei nõua kohustuslikku töötlemist ega deklareerimist.
  • Esindavad vigu, mis sageli viitavad loogikavigadele koodis või mittestandardsetele täitmise keskkonna seisunditele (näiteks NullPointerException, ArrayIndexOutOfBoundsException).

Erandite töötlemine:

Kasutatakse try-catch-finally plokke:

  • try: Koodiplokk, mis võib põhjustada erandi.
  • catch: Koodiplokk, mis käivitatakse, kui try plokis tekib määratud tüüpi erand.
  • finally: Koodiplokk, mis käivitatakse sõltumata sellest, kas erand tekkis või mitte. Sageli kasutatakse ressursside vabastamiseks.
try {
    // Kood, mis võib põhjustada erandi
    int result = 10 / 0; // Näide: ArithmeticException
} catch (ArithmeticException e) {
    // ArithmeticException töötlemine
    System.err.println("Jagamine nulliga viga: " + e.getMessage());
} catch (Exception e) {
    // Kõikide teiste erandite töötlemine
    System.err.println("Üldine viga: " + e.getMessage());
} finally {
    // Kood, mis käivitatakse alati
    System.out.println("Finally plokk täidetud.");
}

Erandite edastamine:

Meetod võib deklareerida, et see võib genereerida teatud erandi, kasutades throws sõna:

public void readFile(String filePath) throws FileNotFoundException, IOException {
    // Faili lugemise kood
    FileReader fr = new FileReader(filePath);
    // Kui fail ei leidu, võib visata `FileNotFoundException`
    // Kui tekib sisendi/väljundi viga, võib visata `IOException`
    // ...
}

Kutsuv meetod peab kas töötlema selle erandi (try-catch) või deklareerima, et ta edastab selle edasi.

Oma erandite loomine:

Võite luua oma erandiklassid, pärides Exception-ist (Checked Exceptions) või RuntimeException-ist (Unchecked Exceptions):

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

Kasutus:

public void processData(int value) throws MyCustomException {
    if (value < 0) {
        throw new MyCustomException("Väärtus ei saa olla negatiivne");
    }
    // Andmete töötlemine
}

Peamised erandiklassid (hierarhia):

  • java.lang.Throwable (kõigi vigade ja erandite alusklass)
    • java.lang.Error (tõsiste probleemide jaoks, mida tavaliselt ei töödelda programmis, näiteks OutOfMemoryError)
    • java.lang.Exception (erandid, mida programm saab töödelda)
      • java.lang.RuntimeException (Unchecked Exceptions)
        • NullPointerException
        • ArrayIndexOutOfBoundsException
        • ArithmeticException
        • ja teised
      • Teised Exception alamklassid
        • IOException
        • FileNotFoundException
        • SQLException
        • ja teised

Eranditega töötamine hõlmab selle hierarhia mõistmist, sobiva eranditüübi valimist (oma omadeks), tõhusat try-catch-finally kasutamist erandite töötlemiseks ja edastamiseks ning vigade logimist veaotsinguks.