Επιλεγμένη εξαίρεση έναντι εξαίρεσης χρόνου εκτέλεσης
Οι εξαιρέσεις είναι ειδικοί τύποι συμβάντων, που μπορεί να διαταράξουν την κανονική ροή του προγράμματος. Η εξαίρεση του ονόματος προέρχεται από το "εξαιρετικό γεγονός". Η απόρριψη μιας εξαίρεσης είναι η διαδικασία δημιουργίας ενός αντικειμένου εξαίρεσης και παράδοσης του στο σύστημα χρόνου εκτέλεσης. Όταν το σύστημα χρόνου εκτέλεσης λάβει το αντικείμενο εξαίρεσης, θα προσπαθήσει να βρει κάποιον για να το χειριστεί μέσα στη στοίβα κλήσεων περνώντας το με την αντίστροφη σειρά (με την οποία κλήθηκαν οι μέθοδοι). Το σύστημα χρόνου εκτέλεσης είναι επιτυχές εάν βρει μια μέθοδο με έναν χειριστή εξαιρέσεων. Ο χειριστής εξαίρεσης είναι ένα μπλοκ κώδικα που μπορεί επίσημα να χειριστεί την εν λόγω εξαίρεση. Εάν το σύστημα χρόνου εκτέλεσης βρει έναν κατάλληλο χειριστή, θα μεταβιβάσει το αντικείμενο εξαίρεσης στον χειριστή. Αυτό ονομάζεται αλίευση της εξαίρεσης. Ωστόσο, εάν δεν είναι δυνατός ο χειρισμός της εξαίρεσης, το πρόγραμμα θα τερματιστεί. Στην Java, οι εξαιρέσεις κληρονομούνται από την κλάση Throwable. Οι επιλεγμένες εξαιρέσεις είναι εξαιρέσεις στις οποίες ο χειρισμός επιβάλλεται από τον μεταγλωττιστή. Οι εξαιρέσεις χρόνου εκτέλεσης είναι ένας τύπος εξαιρέσεων που δεν ελέγχονται από τον μεταγλωττιστή.
Τι είναι η επιλεγμένη εξαίρεση;
Επιλεγμένες εξαιρέσεις είναι είτε αντικείμενα της κλάσης java.lang.exception είτε οι υποκλάσεις της (εκτός από το java.lang. RuntimeException και τις υποκλάσεις του). Οι επιλεγμένες εξαιρέσεις «ελέγχονται» τη στιγμή της μεταγλώττισης. Αυτό σημαίνει ότι ο προγραμματιστής πρέπει είτε να πιάσει είτε να πετάξει αυτές τις εξαιρέσεις, διαφορετικά η μεταγλώττιση θα παραπονεθεί (προκαλώντας σφάλμα μεταγλώττισης). Για αυτόν τον λόγο, πολλές ελεγμένες εξαιρέσεις είναι πολύ γνωστές στους προγραμματιστές. Για παράδειγμα, το IOException και οι υποκατηγορίες του είναι επιλεγμένες εξαιρέσεις και όποτε ο προγραμματιστής ασχολείται με την πρόσβαση ή την τροποποίηση ενός αρχείου, ο μεταγλωττιστής ελέγχει για να βεβαιωθεί ότι όλες οι πιθανές IOExceptions λαμβάνονται υπόψη από τον προγραμματιστή.
Τι είναι η εξαίρεση χρόνου εκτέλεσης;
Οι εξαιρέσεις χρόνου εκτέλεσης αποτελούνται από το java.lang. RuntimeException και όλες τις υποκατηγορίες του. Θεωρητικά μιλώντας, εξυπηρετούν τον ίδιο σκοπό με τις ελεγμένες εξαιρέσεις, και μπορούν να τεθούν ή να αντιμετωπιστούν σαν επιλεγμένη εξαίρεση, αλλά ο χειρισμός τους δεν επιβάλλεται από τον μεταγλωττιστή. Επομένως, οι εξαιρέσεις χρόνου εκτέλεσης ανήκουν στην οικογένεια των μη επιλεγμένων εξαιρέσεων. Οι NullPointerException, NumberFormatEception, ClassCastException και ArrayIndexOutOfBoundsException είναι κοινές εξαιρέσεις χρόνου εκτέλεσης στην Java.
Ποια είναι η διαφορά μεταξύ Επιλεγμένης Εξαίρεσης και Εξαίρεσης χρόνου εκτέλεσης;
Αν και, τόσο οι επιλεγμένες εξαιρέσεις όσο και οι εξαιρέσεις χρόνου εκτέλεσης είναι ανεπιθύμητο φαινόμενο κατά την εκτέλεση ενός προγράμματος, έχουν τις διαφορές τους. Ο χειρισμός ελεγμένων εξαιρέσεων επιβάλλεται από τον μεταγλωττιστή, αλλά οι εξαιρέσεις χρόνου εκτέλεσης δεν επιβάλλονται. Ως εκ τούτου, οι ελεγμένες εξαιρέσεις πρέπει να απορρίπτονται ή να χειρίζονται για να μεταγλωττιστεί ο κώδικας, αλλά δεν υπάρχει τέτοια απαίτηση σχετικά με τις εξαιρέσεις χρόνου εκτέλεσης. Κατά συνέπεια, οι εξαιρέσεις χρόνου εκτέλεσης ανήκουν στην κατηγορία μη επιλεγμένων εξαιρέσεων μαζί με σφάλματα.
Μειονέκτημα με επιλεγμένες εξαιρέσεις είναι ότι ο προγραμματιστής πρέπει να το χειριστεί ακόμα κι αν δεν ξέρει πώς να το κάνει. Έτσι, εάν ο προγραμματιστής κάνει απλώς μια νέα εξαίρεση χωρίς να τυλίξει το πρωτότυπο, το ίχνος στοίβας που ανήκει στην αρχική εξαίρεση θα χαθεί. Εδώ είναι χρήσιμες οι εξαιρέσεις χρόνου εκτέλεσης. Επειδή όλες οι εξαιρέσεις χρόνου εκτέλεσης μπορούν να αντιμετωπιστούν σε ένα μόνο μέρος, έτσι οι προγραμματιστές μπορούν να γράψουν μικρότερη ποσότητα κώδικα. Από την άλλη, δεδομένου ότι οι ελεγμένες εξαιρέσεις πρέπει να συλληφθούν, δεν υπάρχει καμία έκπληξη για τον προγραμματιστή. Θα ξέρει πάντα ποια επιλεγμένη εξαίρεση θα μπορούσε να γίνει με μια συγκεκριμένη μέθοδο. Σε αντίθεση με αυτό, διάφορες εξαιρέσεις χρόνου εκτέλεσης μπορούν να τεθούν χωρίς τη γνώση του προγραμματιστή.