Διαφήμιση
Ως προγραμματιστής newbie Πώς να μάθουν τον προγραμματισμό χωρίς όλο το άγχοςΊσως έχετε αποφασίσει να συνεχίσετε τον προγραμματισμό, είτε για επαγγελματική σταδιοδρομία είτε για χόμπι. Μεγάλος! Αλλά ίσως αρχίζετε να αισθάνεστε συγκλονισμένοι. Οχι και τόσο καλό. Εδώ μπορείτε να διευκολύνετε το ταξίδι σας. Διαβάστε περισσότερα , η εννοια του χειρισμού εξαιρέσεων μπορεί να είναι δύσκολο να τυλίξετε το κεφάλι σας γύρω. Όχι ότι η ίδια η έννοια είναι δύσκολη, αλλά η ορολογία μπορεί να φανεί πιο προηγμένη από ό, τι είναι. Και είναι ένα τόσο ισχυρό χαρακτηριστικό που είναι επιρρεπές σε κατάχρηση και κατάχρηση.
Σε αυτό το άρθρο, θα μάθετε ποιες εξαιρέσεις είναι, γιατί είναι σημαντικές, πώς να τις χρησιμοποιήσετε και κοινά λάθη που πρέπει να αποφύγετε. Οι περισσότερες σύγχρονες γλώσσες 6 πιο εύκολες γλώσσες προγραμματισμού για να μάθετε για αρχάριουςΗ εκμάθηση του προγράμματος αφορά την εξεύρεση της σωστής γλώσσας εξίσου με τη διαδικασία της οικοδόμησης. Εδώ είναι οι έξι πιο εύκολες γλώσσες προγραμματισμού για αρχάριους. Διαβάστε περισσότερα
έχετε κάποιο χειρισμό εξαιρέσεων, οπότε αν εσείς ποτέ να προχωρήσετε από την Java 7 Χρήσιμα κόλπα για την κατοχύρωση μιας νέας γλώσσας προγραμματισμούΕίναι εντάξει να είστε συγκλονισμένοι όταν μαθαίνετε να κωδικοποιείτε. Θα ξεχάσετε πιθανώς τα πράγματα τόσο γρήγορα όσο τα μαθαίνετε. Αυτές οι συμβουλές μπορούν να σας βοηθήσουν να διατηρήσετε καλύτερα όλες αυτές τις νέες πληροφορίες. Διαβάστε περισσότερα , μπορείτε να πάρετε μαζί σας τις περισσότερες από αυτές τις συμβουλές.Κατανόηση Εξαιρέσεων Java
Στην Java, ένα εξαίρεση είναι ένα αντικείμενο που υποδεικνύει κάτι ανώμαλο (ή "εξαιρετικό") που συνέβη κατά την εκτέλεση της εφαρμογής σας. Τέτοιες εξαιρέσεις είναι ρίχνονται, το οποίο ουσιαστικά σημαίνει ότι δημιουργείται ένα αντικείμενο εξαίρεσης (παρόμοιο με το πώς "δημιουργούνται" τα σφάλματα).
Η ομορφιά είναι ότι μπορείτε σύλληψη εκτοξεύσεις εξαιρέσεων, οι οποίες σας επιτρέπουν να ασχοληθείτε με την ανώμαλη κατάσταση και να επιτρέψετε την εφαρμογή σας να συνεχίσει να λειτουργεί σαν να μην πήγε τίποτα στραβά. Για παράδειγμα, ενώ ένας μηδενικός δείκτης στον C ενδέχεται να συντρίψει την εφαρμογή σας, η Java σάς επιτρέπει να ρίχνετε και να πιάσετε NullPointerException
s πριν από μια μηδενική μεταβλητή έχει την ευκαιρία να προκαλέσει μια συντριβή.
Θυμηθείτε, μια εξαίρεση είναι απλώς ένα αντικείμενο, αλλά με ένα σημαντικό χαρακτηριστικό: πρέπει να επεκταθεί από το Εξαίρεση
κατηγορία ή οποιαδήποτε υποκατηγορία Εξαίρεση
. Ενώ η Java έχει όλα τα είδη των ενσωματωμένων εξαιρέσεων, μπορείτε επίσης να δημιουργήσετε τη δική σας, αν θέλετε. Κάποια από τα πιο συνηθισμένες εξαιρέσεις Java περιλαμβάνω:
NullPointerException
NumberFormatException
Παράνομη εξαίρεσηArgument
RuntimeException
ΠαράνομηΣυμμετοχή
Τι συμβαίνει όταν κάνετε μια εξαίρεση;
Πρώτον, η Java εξετάζει την άμεση μέθοδο για να διαπιστώσει αν υπάρχει κώδικας που χειρίζεται το είδος εξαίρεσης που ρίξατε. Εάν ένας χειριστής δεν υπάρχει, εξετάζει τη μέθοδο που κάλεσε την τρέχουσα μέθοδο για να δει αν υπάρχει χειρολαβή εκεί. Αν όχι, εξετάζει τη μέθοδο που κάλεσε ότι μέθοδο, και στη συνέχεια την επόμενη μέθοδο, κλπ. Εάν η εξαίρεση δεν έχει αλιευθεί, η εφαρμογή εκτυπώνει ένα ίχνος στοίβας και στη συνέχεια συντρίβεται. (Στην πραγματικότητα, είναι πιο χρωματική από απλά συντριβή, αλλά αυτό είναι ένα προηγμένο θέμα πέρα από το πεδίο εφαρμογής αυτού του άρθρου.)
ΕΝΑ ίχνη στοίβας είναι μια λίστα με όλες τις μεθόδους που διέσχισε η Java ενώ αναζητούσε έναν χειριστή εξαιρέσεων. Ακολουθεί το ακόλουθο ίχνος:
Εξαίρεση στο νήμα "main" java.lang. NullPointerException στο com.example.myproject. Book.getTitle (Book.java: 16) στο com.example.myproject. Author.getBookTitles (Author.java: 25) στο com.example.myproject. Bootstrap.main (Bootstrap.java: 14)
Μπορούμε να βγάλουμε πολλά από αυτό. Πρώτον, η εξαίρεση ήταν α NullPointerException
. Αυτό συνέβη στο getTitle ()
στη γραμμή 16 του Book.java. Η μέθοδος αυτή κλήθηκε από getBookTitles ()
στη γραμμή 25 του Author.java. Οτι η μέθοδος κλήθηκε από κύριος()
στη γραμμή 14 του Bootstrap.java. Όπως μπορείτε να δείτε, γνωρίζοντας όλα αυτά καθιστά ευκολότερο το σβήσιμο των σφαλμάτων.
Αλλά και πάλι, το πραγματικό όφελος από τις εξαιρέσεις είναι ότι μπορείτε να «χειριστείτε» την ανώμαλη κατάσταση, παγιδεύοντας την εξαίρεση, θέτοντας τα πράγματα σωστά και επαναλαμβάνοντας την εφαρμογή χωρίς να συντρίψετε.
Χρήση εξαιρέσεων Java στον κώδικα
Ας πούμε ότι έχετε someMethod ()
που παίρνει έναν ακέραιο αριθμό και εκτελεί κάποια λογική που θα μπορούσε να σπάσει αν ο ακέραιος είναι μικρότερος από 0 ή μεγαλύτερος από 100. Αυτό θα μπορούσε να είναι ένα καλό μέρος για να κάνετε μια εξαίρεση:
δημόσιο κενό someMethod (τιμή int) {if (τιμή <0 || τιμή> 100) {ρίξει νέα Παράνομη εξαίρεσηArgument
(); } //... }
Για να αντιμετωπίσετε αυτή την εξαίρεση, πρέπει να πάτε στο σημείο someMethod ()
καλείται και χρησιμοποιεί το try-catch block:
δημόσιο κενό callingMethod () {try {someMethod (200); someOtherMethod (); } catch (IllegalArgumentException e) {// χειριστείτε την εξαίρεση εδώ} //... }
Όλα στο εσωτερικό του δοκιμάστε μπλοκ θα εκτελεστεί προκειμένου να εκτοξευθεί μια εξαίρεση. Μόλις πεταχθεί μια εξαίρεση, όλες οι μεταγενέστερες δηλώσεις παραλείπονται και η λογική εφαρμογής μεταβαίνει αμέσως στο σύλληψη ΟΙΚΟΔΟΜΙΚΟ ΤΕΤΡΑΓΩΝΟ.
Στο παράδειγμά μας, εισάγουμε το μπλοκ δοκιμής και καλούμε αμέσως someMethod ()
. Από το 200 δεν είναι μεταξύ 0 και 100, ένα Παράνομη εξαίρεσηArgument
ρίχνονται. Αυτό αμέσως τελειώνει την εκτέλεση του someMethod ()
, παραλείπει το υπόλοιπο της λογικής στο δοκιμαστικό μπλοκ (someOtherMethod ()
δεν καλείται ποτέ) και συνεχίζει την εκτέλεση εντός του μπλοκ αλίευσης.
Τι θα συμβεί αν τηλεφωνήσαμε someMethod (50)
αντι αυτου? ο Παράνομη εξαίρεσηArgument
ποτέ δεν θα ρίχνονταν. someMethod ()
θα εκτελεστεί κανονικά. Το μπλοκ δοκιμής θα εκτελεστεί κανονικά, καλώντας someOtherMethod ()
όταν ολοκληρωθεί κάποιαMethod (). Οταν someOtherMethod ()
τελειώνει, το μπλοκ αλίευσης θα παραλειφθεί και callingMethod ()
θα συνεχιζόταν.
Σημειώστε ότι μπορείτε να έχετε πολλαπλά μπλοκ συλλογής ανά μπλοκ δοκιμής:
δημόσιο κενό callingMethod () {try {someMethod (200); someOtherMethod (); } catch (IllegalArgumentException e) {// χειριστείτε την εξαίρεση εδώ} catch (NullPointerException e) {// χειριστείτε την εξαίρεση εδώ} //... }
Σημειώστε επίσης ότι ένα προαιρετικό τελικά μπλοκ υπάρχει επίσης:
δημόσια μέθοδος void () {try {//... } catch (Εξαίρεση e) {//... } τελικά { //... } }
Ο κώδικας είναι τελικά ένα μπλοκ πάντα εκτελεστεί ανεξάρτητα από το τι. Εάν έχετε μια δήλωση επιστροφής στο δοκιμαστικό μπλοκ, το τελικό μπλοκ εκτελείται πριν επιστρέψετε εκτός της μεθόδου. Εάν πετάξετε μια άλλη εξαίρεση στο μπλοκ αλίευσης, το μπλοκ τελικά εκτελείται πριν από τη ρίψη της εξαίρεσης.
Θα πρέπει να χρησιμοποιήσετε το τετράγωνο όταν έχετε αντικείμενα που πρέπει να καθαριστούν πριν τελειώσει η μέθοδος. Για παράδειγμα, εάν ανοίξατε ένα αρχείο στο δοκιμαστικό μπλοκ και αργότερα πετάξατε μια εξαίρεση, το τελικό μπλοκ σας επιτρέπει να κλείσετε το αρχείο πριν εγκαταλείψετε τη μέθοδο.
Σημειώστε ότι μπορείτε να έχετε τελικά ένα μπλοκ χωρίς μπλοκ:
δημόσια μέθοδος void () {try {//... } τελικά { //... } }
Αυτό σας επιτρέπει να κάνετε οποιοδήποτε απαραίτητο καθαρισμό επιτρέποντας παράλληλα εξαιρέσεις για να διαδώσετε τη μέθοδο stack κλήσεων (δηλ. δεν θέλετε να χειριστείτε την εξαίρεση εδώ, αλλά θα πρέπει να καθαρίσετε πρώτα).
Έλεγχος εναντίον Μη ελεγμένες εξαιρέσεις στην Java
Σε αντίθεση με τις περισσότερες γλώσσες, η Java διακρίνει μεταξύ ελέγχονται οι εξαιρέσεις και μη ελεγμένες εξαιρέσεις (π.χ., το C # έχει μόνο μη ελεγμένες εξαιρέσεις). Μια εξακριβωμένη εξαίρεση πρέπει να συλληφθεί στη μέθοδο όπου ρίχνεται η εξαίρεση ή αλλιώς ο κώδικας δεν θα μεταγλωττιστεί.
Για να δημιουργήσετε μια εξακριβωμένη εξαίρεση, επεκτείνετε από Εξαίρεση
. Για να δημιουργήσετε μια μη ελεγχόμενη εξαίρεση, επεκτείνετε από RuntimeException
.
Κάθε μέθοδος που ρίχνει μια εξακριβωμένη εξαίρεση πρέπει να υποδηλώνει αυτό στην υπογραφή μεθόδου χρησιμοποιώντας το ρίχνει λέξη-κλειδί. Από την ενσωματωμένη έκδοση του Java IOException
είναι μια εξακριβωμένη εξαίρεση, ο ακόλουθος κώδικας δεν θα μεταγλωττιστεί:
δημόσιο κενό wontCompile () {//... αν (someCondition) {ρίξει νέα IOException (); } //... }
Πρέπει πρώτα να δηλώσετε ότι εκτελεί μια εξακριβωμένη εξαίρεση:
δημόσιο κενό willCompile () ρίχνει IOException {//... αν (someCondition) {ρίξει νέα IOException (); } //... }
Σημειώστε ότι μια μέθοδος μπορεί να δηλωθεί ως ρίχνοντας μια εξαίρεση αλλά ποτέ να μην ρίξει μια εξαίρεση. Παρόλα αυτά, η εξαίρεση θα χρειαστεί ακόμα να πιαστεί ή αλλιώς ο κώδικας δεν θα μεταγλωττιστεί.
Πότε πρέπει να χρησιμοποιείτε ελεγμένες ή ανεξέλεγκτες εξαιρέσεις;
Η επίσημη τεκμηρίωση Java έχει ένα σε αυτή την ερώτηση. Συνοψίζει τη διαφορά με έναν σύντομο κανόνα: "Εάν ένας πελάτης μπορεί ευλόγως να αναμένεται να ανακάμψει από μια εξαίρεση, να το κάνει μια εξακριβωμένη εξαίρεση. Εάν ένας πελάτης δεν μπορεί να κάνει τίποτα για να ανακτήσει από την εξαίρεση, να κάνει μια ανεξέλεγκτη εξαίρεση. "
Αλλά αυτή η κατευθυντήρια γραμμή μπορεί να είναι ξεπερασμένη. Από τη μία πλευρά, ελέγχονται οι εξαιρέσεις οδηγούν σε πιο ισχυρό κώδικα 10 Συμβουλές για το γράψιμο Cleaner & Better CodeΓράφοντας καθαρό κώδικα φαίνεται ευκολότερο από ό, τι στην πραγματικότητα είναι, αλλά τα οφέλη αξίζει τον κόπο. Δείτε πώς μπορείτε να αρχίσετε να γράφετε καθαρότερος κώδικας σήμερα. Διαβάστε περισσότερα . Από την άλλη πλευρά, καμία άλλη γλώσσα δεν έχει ελέγξει τις εξαιρέσεις με τον ίδιο τρόπο όπως η Java, η οποία δείχνει δύο πράγματα: ένα, το χαρακτηριστικό δεν είναι αρκετά χρήσιμο για άλλες γλώσσες να το κλέψουν, και δύο, μπορείτε να ζήσετε απόλυτα χωρίς τους. Επιπλέον, οι εξακριβωμένες εξαιρέσεις δεν παίζουν καλά με τις εκφράσεις lambda που παρουσιάζονται στην Java 8.
Κατευθυντήριες γραμμές για τη χρήση εξαιρέσεων Java
Οι εξαιρέσεις είναι χρήσιμες αλλά εύκολα καταχρηστικές και καταχρηστικές. Ακολουθούν μερικές συμβουλές και βέλτιστες πρακτικές που θα σας βοηθήσουν να αποφύγετε να τους χρεώσετε.
-
Προτιμήστε ειδικές εξαιρέσεις στις γενικές εξαιρέσεις. Χρήση
NumberFormatException
πάνω απόΠαράνομη εξαίρεσηArgument
όταν είναι δυνατόν, διαφορετικά να χρησιμοποιείτεΠαράνομη εξαίρεσηArgument
πάνω απόRuntimeException
όταν είναι δυνατόν. -
Ποτέ μην πιάσετε
Πτυσσόμενο
! οΕξαίρεση
τάξη στην πραγματικότητα επεκτείνεταιΠτυσσόμενο
, και το μπλοκ συλλογής λειτουργεί πραγματικά μεΠτυσσόμενο
ή οποιαδήποτε κατηγορία που επεκτείνει το Throwable. Ωστόσο, τοΛάθος
τάξη επεκτείνεται επίσηςΠτυσσόμενο
, και ποτέ δεν θέλετε να πιάσετε έναΛάθος
επειδήΛάθος
s δείχνουν σοβαρά ανεπανόρθωτα ζητήματα. -
Ποτέ μην πιάσετε
Εξαίρεση
!ΔιακοπήΕξαίρεση
επεκτείνεταιΕξαίρεση
, έτσι κάθε μπλοκ που συλλαμβάνειΕξαίρεση
θα πιάσει επίσηςΔιακοπήΕξαίρεση
, και αυτή είναι μια πολύ σημαντική εξαίρεση που δεν θέλετε να χάσετε (ειδικά σε εφαρμογές πολλαπλών νημάτων) εκτός αν ξέρετε τι κάνετε. Εάν δεν γνωρίζετε την εξαίρεση που πρέπει να πιάσετε, μην σκεφτείτε να μην τραβήξετε τίποτα. -
Χρησιμοποιήστε περιγραφικά μηνύματα για να διευκολύνετε την εκσφαλμάτωση. Όταν ρίχνετε μια εξαίρεση, μπορείτε να παρέχετε ένα
Σειρά
μήνυμα ως επιχείρημα. Αυτό το μήνυμα μπορεί να προσπελαστεί στο μπλοκ αλίευσης χρησιμοποιώντας τοException.getMessage ()
αλλά αν δεν γίνει ποτέ η εξαίρεση, το μήνυμα θα εμφανιστεί επίσης ως μέρος του ίχνους στοίβας. -
Προσπαθήστε να μην πιάσετε και να αγνοήσετε τις εξαιρέσεις. Για να ξεπεραστεί η ταλαιπωρία των ελεγχόμενων εξαιρέσεων, πολλοί αρχάριοι και τεμπέληδες προγραμματιστές θα δημιουργήσουν ένα μπλοκ αλίευσης αλλά θα το αφήσουν άδειο. Κακό! Πάντα να το χειρίζεστε με χαρά, αλλά αν δεν μπορείτε, τουλάχιστον να εκτυπώσετε ένα ίχνος στοίβας, ώστε να ξέρετε ότι η εξαίρεση έχει ριχτεί. Μπορείτε να το κάνετε χρησιμοποιώντας το
Exception.printStackTrace ()
μέθοδος. - Προσοχή στις υπερβολικές εξαιρέσεις. Όταν έχετε ένα σφυρί, όλα μοιάζουν με ένα καρφί. Όταν μάθετε για τις εξαιρέσεις, ίσως να αισθάνεστε υποχρεωμένοι να μετατρέψετε τα πάντα σε μια εξαίρεση... έως το σημείο όπου το μεγαλύτερο μέρος της ροής ελέγχου της εφαρμογής σας μειώνεται στο χειρισμό εξαιρέσεων. Θυμηθείτε, οι εξαιρέσεις προορίζονται για "εξαιρετικά" περιστατικά!
Τώρα θα πρέπει να είστε αρκετά άνετοι με εξαιρέσεις για να καταλάβετε τι είναι, γιατί χρησιμοποιούνται και πώς να τις ενσωματώσετε στον δικό σας κώδικα. Εάν δεν καταλαβαίνετε πλήρως την έννοια, αυτό είναι εντάξει! Μου πήρε λίγο χρόνο για να κάνω "κλικ" στο κεφάλι μου, έτσι δεν αισθάνεστε ότι πρέπει να το βιάσετε 6 σημάδια που δεν σας ενδιαφέρουν να είστε προγραμματιστέςΔεν είναι όλοι κομμένα για να είναι προγραμματιστής. Εάν δεν είστε απόλυτα σίγουροι ότι θέλετε να είστε προγραμματιστής, υπάρχουν μερικές ενδείξεις που μπορεί να σας οδηγήσουν προς τη σωστή κατεύθυνση. Διαβάστε περισσότερα . Με την ησυχία σου.
Έχετε ερωτήσεις; Γνωρίζετε για οποιεσδήποτε άλλες συμβουλές σχετικά με τις εξαιρέσεις που μου έλειπε; Μοιραστείτε τα με τα παρακάτω σχόλια!
Ο Joel Lee έχει B.S. στην Πληροφορική και πάνω από έξι χρόνια επαγγελματικής γραφής. Είναι ο αρχισυντάκτης του MakeUseOf.