Sobes.tech
Junior

Πώς διαχειρίζονται τα σφάλματα στη Java και πώς να δουλέψετε με αυτά;

sobes.tech AI

Απάντηση από AI

Στο Java, τα σφάλματα διαχειρίζονται με το μηχανισμό εξαιρέσεων. Οι εξαιρέσεις είναι γεγονότα που διακόπτουν την κανονική εκτέλεση του προγράμματος. Υπάρχουν δύο τύποι εξαιρέσεων: Checked Exceptions και Unchecked Exceptions.

Checked Exceptions:

  • Κληρονομούν από το java.lang.Exception (εκτός από το RuntimeException).
  • Πρέπει να διαχειρίζονται υποχρεωτικά (με try-catch) ή να δηλώνονται στη υπογραφή της μεθόδου (με throws).
  • Αντιπροσωπεύουν σφάλματα που μπορεί να συμβούν υπό κανονικές συνθήκες (π.χ., IOException, FileNotFoundException).

Unchecked Exceptions:

  • Κληρονομούν από το java.lang.RuntimeException ή το java.lang.Error.
  • Δεν απαιτούν υποχρεωτική διαχείριση ή δήλωση.
  • Αντιπροσωπεύουν σφάλματα που συχνά υποδεικνύουν λογικά σφάλματα στον κώδικα ή μη φυσιολογικές καταστάσεις εκτέλεσης (π.χ., NullPointerException, ArrayIndexOutOfBoundsException).

Διαχείριση εξαιρέσεων:

Χρησιμοποιούνται μπλοκ try-catch-finally:

  • try: Μπλοκ κώδικα που μπορεί να δημιουργήσει εξαίρεση.
  • catch: Μπλοκ κώδικα που εκτελείται αν προκύψει εξαίρεση του συγκεκριμένου τύπου στο try. Μπορούν να υπάρχουν πολλαπλά catch για διαφορετικούς τύπους εξαιρέσεων.
  • finally: Μπλοκ κώδικα που εκτελείται πάντα, ανεξάρτητα αν προέκυψε εξαίρεση ή όχι. Χρησιμοποιείται συχνά για απελευθέρωση πόρων (π.χ., κλείσιμο αρχείων, συνδέσεων).
try {
    // Κώδικας που μπορεί να προκαλέσει εξαίρεση
    int result = 10 / 0; // Παράδειγμα: ArithmeticException
} catch (ArithmeticException e) {
    // Διαχείριση ArithmeticException
    System.err.println("Σφάλμα διαίρεσης με το μηδέν: " + e.getMessage());
    // Μπορεί να γίνει καταγραφή σφάλματος, εμφάνιση μηνύματος στον χρήστη, κ.λπ.
} catch (Exception e) {
    // Διαχείριση οποιασδήποτε άλλης εξαίρεσης
    System.err.println("Παρουσιάστηκε γενικό σφάλμα: " + e.getMessage());
} finally {
    // Κώδικας που εκτελείται πάντα
    System.out.println("Το μπλοκ finally εκτελέστηκε.");
}

Μεταφορά εξαιρέσεων:

Μια μέθοδος μπορεί να δηλώσει ότι μπορεί να δημιουργήσει μια συγκεκριμένη εξαίρεση χρησιμοποιώντας τη λέξη-κλειδί throws:

public void readFile(String filePath) throws FileNotFoundException, IOException {
    // Κώδικας ανάγνωσης αρχείου
    // Αν το αρχείο δεν βρεθεί, μπορεί να ριχτεί `FileNotFoundException` (υποκλάση του `IOException`)
    FileReader fr = new FileReader(filePath);
    // Αν προκύψει σφάλμα εισόδου/εξόδου, μπορεί να ριχτεί `IOException`
    // ...
}

Ο καλών η μέθοδος πρέπει είτε να διαχειριστεί αυτή την εξαίρεση (try-catch) είτε να την δηλώσει και αυτή με throws.

Δημιουργία δικών σας εξαιρέσεων:

Μπορείτε να δημιουργήσετε δικές σας κλάσεις εξαιρέσεων κληρονομώντας από το Exception (για Checked Exceptions) ή το RuntimeException (για Unchecked Exceptions).

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

Χρήση:

public void processData(int value) throws MyCustomException {
    if (value < 0) {
        throw new MyCustomException("Η τιμή δεν μπορεί να είναι αρνητική");
    }
    // Επεξεργασία δεδομένων
}

Βασικές κλάσεις εξαιρέσεων (ιεραρχία):

  • java.lang.Throwable (βασική κλάση για όλες τις σφάλματα και εξαιρέσεις)
    • java.lang.Error (για σοβαρά προβλήματα που συνήθως δεν διαχειρίζονται από το πρόγραμμα, π.χ., OutOfMemoryError)
    • java.lang.Exception (για εξαιρέσεις που μπορεί να διαχειριστεί το πρόγραμμα)
      • java.lang.RuntimeException (Unchecked Exceptions)
        • NullPointerException
        • ArrayIndexOutOfBoundsException
        • ArithmeticException
        • κ.ά.
      • Άλλες υποκλάσεις του Exception (Checked Exceptions)
        • IOException
        • FileNotFoundException
        • SQLException
        • κ.ά.

Η εργασία με σφάλματα περιλαμβάνει την κατανόηση αυτής της ιεραρχίας, την επιλογή του κατάλληλου τύπου εξαίρεσης (κατά τη δημιουργία δικών σας), την αποτελεσματική χρήση του try-catch-finally για διαχείριση και μεταφορά, καθώς και την καταγραφή σφαλμάτων για αποσφαλμάτωση.