Διαδρομές
/
Java
Java
/
Ύλη
/
Εξαιρέσεις
Εξ

Εξαιρέσεις σε Java

25 ασκήσεις

Σχετικά με την έννοια Εξαιρέσεις

Η γλώσσα προγραμματισμού Java χρησιμοποιεί εξαιρέσεις για να χειρίζεται σφάλματα και άλλα έκτακτα συμβάντα.

Τι είναι μια εξαίρεση

Μια εξαίρεση είναι ένα συμβάν που συμβαίνει κατά την εκτέλεση ενός προγράμματος και διαταράσσει την κανονική ροή των εντολών. Στη Java, οι εξαιρέσεις πετιούνται ρητά, και η ενέργεια του να πετάς μια εξαίρεση ονομάζεται πέταγμα εξαίρεσης. Η ενέργεια του να χειρίζεσαι μια εξαίρεση ονομάζεται σύλληψη εξαίρεσης.

Στη Java, όλες οι εξαιρέσεις είναι υποκλάσεις της κλάσης Exception, η οποία είναι με τη σειρά της υποκλάση της Throwable.

Η Java διακρίνει δύο τύπους εξαιρέσεων:

  1. Ελεγχόμενες εξαιρέσεις
  2. Μη ελεγχόμενες εξαιρέσεις

Ελεγχόμενες εξαιρέσεις

Οι ελεγχόμενες εξαιρέσεις είναι έκτακτες συνθήκες που μια εφαρμογή πρέπει να προβλέψει και από τις οποίες πρέπει να ανακάμψει. Ένα παράδειγμα ελεγχόμενης εξαίρεσης είναι η FileNotFoundException, η οποία προκύπτει όταν μια μέθοδος προσπαθεί να διαβάσει ένα αρχείο που δεν υπάρχει.

Αυτός ο τύπος εξαίρεσης ελέγχεται κατά τη μεταγλώττιση: οι μέθοδοι που πετούν ελεγχόμενες εξαιρέσεις πρέπει να το δηλώνουν στην υπογραφή της μεθόδου τους, και ο κώδικας που καλεί μια μέθοδο που μπορεί να πετάξει μια ελεγχόμενη εξαίρεση υποχρεούται να τη χειριστεί, αλλιώς δεν θα μεταγλωττιστεί.

Όλες οι ελεγχόμενες εξαιρέσεις είναι υποκλάσεις της Exception που δεν επεκτείνουν την RuntimeException.

Μη ελεγχόμενες εξαιρέσεις

Οι μη ελεγχόμενες εξαιρέσεις είναι έκτακτες συνθήκες που μια εφαρμογή συνήθως δεν μπορεί να προβλέψει ή από τις οποίες δεν μπορεί να ανακάμψει. Ένα παράδειγμα μη ελεγχόμενης εξαίρεσης είναι η NullPointerException, η οποία προκύπτει όταν μια μέθοδος που περιμένει μια τιμή διάφορη του null λαμβάνει null.

Αυτός ο τύπος εξαίρεσης δεν ελέγχεται κατά τη μεταγλώττιση: οι μέθοδοι που πετούν μη ελεγχόμενες εξαιρέσεις δεν υποχρεούνται να το δηλώνουν στην υπογραφή της μεθόδου τους, και ο κώδικας που καλεί μια μέθοδο που μπορεί να πετάξει μια μη ελεγχόμενη εξαίρεση δεν υποχρεούται να τη χειριστεί.

Όλες οι μη ελεγχόμενες εξαιρέσεις κληρονομούν από την RuntimeException, η οποία είναι με τη σειρά της επέκταση της Exception.

Πώς πετάμε εξαιρέσεις

Μια μέθοδος στη Java μπορεί να πετάξει μια εξαίρεση χρησιμοποιώντας την εντολή throw.

Πώς πετάμε μια ελεγχόμενη εξαίρεση

Όταν μια μέθοδος πετάει μια ελεγχόμενη εξαίρεση, απαιτείται να το δηλώσει στην υπογραφή της μεθόδου χρησιμοποιώντας τη λέξη-κλειδί throws, όπως φαίνεται στο παρακάτω παράδειγμα. Αυτό αναγκάζει τον κώδικα που καλεί να προβλέψει ότι μπορεί να πεταχτεί μια εξαίρεση και να τη χειριστεί ανάλογα.

public class InsufficientBalanceException extends Exception {

}

public class BankAccount {
  public void withdraw(double amount) throws InsufficientBalanceException {
    if (balance < amount) {
      throw new InsufficientBalanceException();
    }

    // rest of the method implementation
  }
}

Πώς πετάμε μια μη ελεγχόμενη εξαίρεση

Όταν μια μέθοδος πετάει μια μη ελεγχόμενη εξαίρεση, δεν απαιτείται να το δηλώσει στην υπογραφή της μεθόδου, αν και υποστηρίζεται.

public class BankAccount {
  public void withdraw(double amount) {
    if (amount < 0) {
      throw new IllegalArgumentException("Cannot withdraw a negative amount");
    }

    // rest of the method implementation
  }
}

Χειρισμός εξαιρέσεων

Ο χειρισμός εξαιρέσεων στη Java γίνεται με τις λέξεις-κλειδιά try, catch και finally.

  • Οι εντολές κώδικα που μπορεί να πετάξουν μια εξαίρεση θα πρέπει να περικλείονται σε ένα μπλοκ try.
  • Το μπλοκ try ακολουθείται από ένα ή περισσότερα μπλοκ catch που συλλαμβάνουν τις εξαιρέσεις που πετιούνται στο μπλοκ try.
  • Τα μπλοκ catch ακολουθούνται προαιρετικά από ένα μπλοκ finally που εκτελείται πάντα μετά το μπλοκ try, ανεξάρτητα από το αν πετάχτηκε κάποια εξαίρεση ή όχι.

Το παρακάτω παράδειγμα δείχνει πώς λειτουργούν αυτές οι λέξεις-κλειδιά:

public class ATM {
  public void withdraw(BankAccount bankAccount, double amount) {
    try {
      System.out.println("Withdrawing " + amount);
      bankAccount.withdraw(amount);
      System.out.println("Withdrawal succeeded");
    } catch (InsufficientBalanceException) {
      System.out.println("Withdrawal failed: insufficient balance");
    } catch (RuntimeException e) {
      System.out.println("Withdrawal failed: " + e.getMessage());
    } finally {
      System.out.println("Current balance: " + bankAccount.getBalance());
    }
  }
}

Σε αυτό το παράδειγμα, όταν δεν πετιέται κάποια εξαίρεση, εκτυπώνεται το εξής:

Withdrawing 10.0
Withdrawal succeeded
Current balance: 5.0

Ωστόσο, αν η εντολή bankAccount.withdraw(amount) πετάξει μια InsufficientBalanceException, εκτυπώνεται το εξής:

Withdrawing 10.0
Withdrawal failed: insufficient balance
Current balance: 5.0

Ή, σε περίπτωση που η bankAccount.withdraw(amount) πετάξει μια μη ελεγχόμενη εξαίρεση, εκτυπώνεται το εξής:

Withdrawing -10.0
Withdrawal failed: Cannot withdraw a negative amount
Current balance: 5.0

Σφάλματα

Η Java έχει επίσης μια ξεχωριστή κατηγορία που ονομάζεται Σφάλματα και περιλαμβάνει σοβαρά προβλήματα που είναι εξωτερικά ως προς την εφαρμογή. Ένα παράδειγμα σφάλματος είναι το OutOfMemoryError, το οποίο προκύπτει όταν μια εφαρμογή προσπαθεί να χρησιμοποιήσει περισσότερη μνήμη από αυτήν που είναι διαθέσιμη στο σύστημα.

Όπως οι μη ελεγχόμενες εξαιρέσεις, τα σφάλματα δεν ελέγχονται κατά τη μεταγλώττιση. Η διαφορά είναι ότι αντιπροσωπεύουν προβλήματα σε επίπεδο συστήματος και συνήθως πετιούνται από την εικονική μηχανή Java ή το περιβάλλον και όχι από την εφαρμογή. Οι εφαρμογές γενικά δεν θα πρέπει να επιχειρούν να τα συλλάβουν ή να τα χειριστούν.

Όλα τα σφάλματα στη Java κληρονομούν από την κλάση Error.

Πότε να μην χρησιμοποιείς εξαιρέσεις

Όπως αναφέρθηκε προηγουμένως, οι εξαιρέσεις είναι συμβάντα που διαταράσσουν την κανονική ροή των εντολών και χρησιμοποιούνται για τον χειρισμό έκτακτων συμβάντων. Ως εκ τούτου, δεν συνιστάται να χρησιμοποιείς εξαιρέσεις για τον έλεγχο ροής στην εφαρμογή σου.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Εξαιρέσεις