5.2  Οι εξαιρέσεις (exceptions) στην Java

Οι εξαιρέσεις (exceptions) στην Java αντιπροσωπεύουν καταστάσεις σφάλματος που μπορεί να προκύψουν κατά την εκτέλεση του κώδικα. Όταν μια εξαίρεση εμφανίζεται, η Java διακόπτει την κανονική εκτέλεση του κώδικα και αναζητά ένα τμήμα κώδικα που μπορεί να χειριστεί την εξαίρεση. Αυτό το τμήμα κώδικα ονομάζεται “catch block” και περιλαμβάνει τις ενέργειες που πρέπει να γίνουν για τη διαχείριση της εξαίρεσης.

Τα exceptions στην Java χωρίζονται σε δύο κατηγορίες: checked exceptions και unchecked exceptions. Οι checked exceptions πρέπει να αντιμετωπιστούν από τον κώδικα (με τη χρήση ενός catch block), ενώ οι unchecked exceptions μπορούν να αγνοηθούν. Η κλάση RuntimeException και οι υποκλάσεις της ανήκουν όλες στις unchecked exceptions.

Εδώ είναι ένα απλό παράδειγμα που δείχνει πώς μπορεί να χρησιμοποιηθεί ένα catch block για να διαχειριστεί μια εξαίρεση στην Java:

public class Main {
  public static void main(String[] args) {
    try {
      int[] myNumbers = {1, 2, 3};
      System.out.println(myNumbers[10]); // Προσπάθεια πρόσβασης σε στοιχείο εκτός ορίων του πίνακα
    } catch (Exception e) {
      System.out.println("Something went wrong."); // Εμφάνιση μηνύματος σε περίπτωση που προκύψει εξαίρεση
    }
  }
}

Ο παραπάνω κώδικας προσπαθεί να προσπελάσει ένα στοιχείο εκτός ορίων ενός πίνακα. Συγκεκριμένα, δημιουργείται ένας πίνακας myNumbers με τις τιμές 1, 2 και 3. Στη συνέχεια, με τη γραμμή κώδικα System.out.println(myNumbers[10]); προσπαθεί να εκτυπώσει το στοιχείο στη θέση 10 του πίνακα, που υπερβαίνει τα όρια του πίνακα.

Λόγω του σφάλματος που προκύπτει λόγω προσπάθειας πρόσβασης σε μη υπάρχουσα θέση του πίνακα, η εξαίρεση ArrayIndexOutOfBoundsException πιάνεται με την catch που ακολουθεί. Στη συνέχεια, εκτυπώνεται το μήνυμα “Something went wrong.” μέσω της γραμμής κώδικα System.out.println("Something went wrong.");.

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

Το catch block μπορεί να χρησιμοποιηθεί και για να εμφανίσει λεπτομέρειες για το σφάλμα που συνέβη, όπως στο παρακάτω παράδειγμα:

public class Main {
  public static void main(String[] args) {
    try {
      int[] myNumbers = {1, 2, 3};

      // Προσπέλαση του 11ου στοιχείου που δεν υπάρχει στον πίνακα
      System.out.println(myNumbers[10]);
    } catch (Exception e) {
      // Εκτύπωση μηνύματος σε περίπτωση που προκύψει εξαίρεση
      System.out.println("Something went wrong.");

      // Εκτύπωση του μηνύματος λάθους που παράχθηκε
      System.out.println(e.getMessage());
    }
  }
}

Ο παραπάνω κώδικας περιέχει ένα τμήμα κώδικα που αντιμετωπίζει εξαιρέσεις (exceptions). Ακολουθεί μια επεξήγηση του τι κάνει ο κώδικας:

  1. Δημιουργείται ένας πίνακας ακεραίων myNumbers με τιμές 1, 2, 3.
  2. Προσπαθεί να προσπελάσει το 11ο στοιχείο του πίνακα (myNumbers[10]), παρόλο που ο πίνακας έχει μόνο 3 στοιχεία.
  3. Επειδή η προσπέλαση του μη υπαρκτού στοιχείου προκαλεί εξαίρεση ArrayIndexOutOfBoundsException, εκτελείται η ενότητα catch του κώδικα.
  4. Εμφανίζεται το μήνυμα “Something went wrong.” που υποδεικνύει ότι κάτι πήγε στραβά.
  5. Εμφανίζεται το μήνυμα λάθους (e.getMessage()) που περιέχει πληροφορίες σχετικά με την εξαίρεση που προκλήθηκε (σε αυτή την περίπτωση, η εξαίρεση θα είναι “Index 10 out of bounds for length 3”).

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

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

Η εντολή try σας επιτρέπει να ορίσετε ένα μπλοκ κώδικα που θα ελεγχθεί για σφάλματα κατά τη διάρκεια της εκτέλεσής του.

[adinserter block=”2″]

Η εντολή catch σας επιτρέπει να ορίσετε ένα μπλοκ κώδικα που θα εκτελεστεί, αν προκύψει ένα σφάλμα στο μπλοκ try.

Οι λέξεις-κλειδιά try και catch έρχονται σε ζεύγη

Σύνταξη:

try {
  // κώδικας που πιθανόν να εκτελεστεί με σφάλματα
} catch(Exception e) {
  // κώδικας που θα εκτελεστεί αν προκύψει σφάλμα
}

Στο παραπάνω παράδειγμα, η εντολή try περιέχει τον κώδικα που μπορεί να προκαλέσει σφάλματα. Το catch block περιέχει τον κώδικα που θα εκτελεστεί αν προκύψει σφάλμα. Η παράμετρος Exception e αναφέρεται στο είδος της εξαίρεσης που προκάλεσε το σφάλμα και μπορεί να χρησιμοποιηθεί για να εμφανίσετε περισσότερες πληροφορίες στον χρήστη.

Με βάση το παρακάτω παράδειγμα θα προκληθεί σφάλμα, καθώς το myNumbers[10] δεν υπάρχει.

public class Main {
  public static void main(String[] args) {
    int[] myNumbers = {1, 2, 3};
    System.out.println(myNumbers[10]);
  }
}

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

Η εντολή finally σας επιτρέπει να εκτελέσετε κώδικα μετά από μια εντολή try…catch, ανεξάρτητα από το αν προκλήθηκε εξαίρεση ή όχι.

Ο κώδικας που θα εκτελεστεί στην finally θα εκτελεστεί πάντα, ανεξαρτήτως του αν εμφανίστηκε εξαίρεση κατά την εκτέλεση του κώδικα στο try block.

[adinserter block=”3″]

Παράδειγμα:

public class Main {
  public static void main(String[] args) {
    try {
      int[] myNumbers = {1, 2, 3};
      System.out.println(myNumbers[10]); // Προσπάθεια πρόσβασης στο στοιχείο με ευκολία 10 που δεν υπάρχει
    } catch (Exception e) {
      System.out.println("Something went wrong."); // Εμφάνιση μηνύματος λάθους εάν προκύψει εξαίρεση
    } finally {
      System.out.println("The 'try catch' is finished."); // Εμφάνιση μηνύματος ότι ο μηχανισμός try-catch ολοκληρώθηκε
    }
  }
}

Ο κώδικας παρουσιάζει τη χρήση των μπλοκ try, catch και finally στη γλώσσα προγραμματισμού Java.

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

Για να αντιμετωπίσει την εξαίρεση, ο κώδικας βρίσκεται μέσα σε ένα μπλοκ try-catch. Οποιαδήποτε εξαίρεση που προκύπτει κατά την εκτέλεση του μπλοκ try πιάνεται από το μπλοκ catch. Στην περίπτωση μας, η εξαίρεση ArrayIndexOutOfBoundsException πιάνεται και εμφανίζει το μήνυμα “Something went wrong.”.

Ακόμη, ο κώδικας περιέχει ένα μπλοκ finally, το οποίο εκτελείται πάντα ανεξαρτήτως της εμφάνισης ή μη εξαίρεσης. Στην περίπτωση μας, εμφανίζει το μήνυμα “The ‘try catch’ is finished.”.

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

Η εντολή throw σας επιτρέπει να δημιουργήσετε ένα προσαρμοσμένο σφάλμα.

Η εντολή throw χρησιμοποιείται μαζί με έναν τύπο εξαίρεσης. Υπάρχουν πολλοί τύποι εξαιρέσεων διαθέσιμοι στην Java: ArithmeticException, FileNotFoundException, ArrayIndexOutOfBoundsException, SecurityException κλπ.

Παράδειγμα:

public class Main {
  // Μέθοδος για έλεγχο της ηλικίας
  static void checkAge(int age) {
    if (age < 18) {
      // Εκτίναξη εξαίρεσης όταν η ηλικία είναι μικρότερη από 18
      throw new ArithmeticException("Access denied - You must be at least 18 years old.");
    }
    else {
      System.out.println("Access granted - You are old enough!");
    }
  }

  public static void main(String[] args) {
    checkAge(15); // Ορισμός ηλικίας σε 15 (που είναι κάτω από τα 18...)
  }
}

Ο παραπάνω κώδικας περιλαμβάνει τη μέθοδο checkAge, η οποία ελέγχει την ηλικία που περνάται ως όρισμα. Αν η ηλικία είναι μικρότερη από 18, εκτίθεται μια εξαίρεση τύπου ArithmeticException με ένα μήνυμα που δηλώνει ότι δεν επιτρέπεται η πρόσβαση λόγω ηλικίας. Αν η ηλικία είναι 18 ή μεγαλύτερη, τότε εμφανίζεται στην οθόνη το μήνυμα “Access granted – You are old enough!”.

Στην main μέθοδος, καλείται η checkAge με όρισμα την τιμή 15, που είναι μικρότερη από 18. Άρα θα εκτιναχθεί μια εξαίρεση ArithmeticException και δεν θα εκτελεστεί το μήνυμα “Access granted – You are old enough!”.

Exception in thread "main" java.lang.ArithmeticException: Access denied - You must be at least 18 years old.
    at Main.checkAge(Main.java:4)
    at Main.main(Main.java:11)
16 Ιουνίου, 2023
top
error: Content is protected !!
Μετάβαση σε γραμμή εργαλείων