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

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

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





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





Κατανόηση εξαιρέσεων Java

Στην Java, ένα εξαίρεση είναι ένα αντικείμενο που υποδεικνύει ότι κάτι μη φυσιολογικό (ή «εξαιρετικό») συνέβη κατά την εκτέλεση της εφαρμογής σας. Τέτοιες εξαιρέσεις είναι πεταμένο , το οποίο ουσιαστικά σημαίνει ότι δημιουργείται ένα αντικείμενο εξαίρεσης (παρόμοιο με το πώς 'αυξάνονται' τα σφάλματα).





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

NullPointerException

s πριν από μια μηδενική μεταβλητή έχει την πιθανότητα να προκαλέσει συντριβή.



Θυμηθείτε, μια εξαίρεση είναι απλώς ένα αντικείμενο, αλλά με ένα σημαντικό χαρακτηριστικό: πρέπει να επεκταθεί από το

Exception

κατηγορία ή οποιαδήποτε υποκατηγορία του





Exception

Το Ενώ η Java έχει κάθε είδους ενσωματωμένες εξαιρέσεις, μπορείτε επίσης να δημιουργήσετε τις δικές σας, αν θέλετε. Κάποια από τα συνηθέστερες εξαιρέσεις Java περιλαμβάνω:

  • NullPointerException
  • NumberFormatException
  • IllegalArgumentException
  • RuntimeException
  • IllegalStateException

Τι συμβαίνει λοιπόν όταν ρίχνετε μια εξαίρεση;





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

ΠΡΟΣ ΤΟ ίχνος στοίβας είναι μια λίστα με όλες τις μεθόδους που πέρασε η Java αναζητώντας έναν χειριστή εξαιρέσεων. Δείτε πώς φαίνεται ένα ίχνος στοίβας:

Exception in thread 'main' java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Μπορούμε να αντλήσουμε πολλά από αυτό. Πρώτον, η εξαίρεση ήταν η α

NullPointerException

Το Συνέβη στην

getTitle()

μέθοδο στη γραμμή 16 του Book.java. Αυτή η μέθοδος κλήθηκε από

getBookTitles()

στη γραμμή 25 του Author.java. Οτι κλήθηκε η μέθοδος από

main()

στη γραμμή 14 του Bootstrap.java. Όπως μπορείτε να δείτε, η γνώση όλων αυτών διευκολύνει τον εντοπισμό σφαλμάτων.

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

Χρήση εξαιρέσεων Java στον κώδικα

Ας πούμε ότι έχετε

someMethod()

που παίρνει έναν ακέραιο και εκτελεί κάποια λογική που θα μπορούσε να σπάσει αν ο ακέραιος είναι μικρότερος από 0 ή μεγαλύτερος από 100. Αυτό θα μπορούσε να είναι ένα καλό μέρος για να ρίξετε μια εξαίρεση:

πώς να αφαιρέσετε δεδομένα από έναν παλιό σκληρό δίσκο
public void someMethod(int value) {
if (value 100) {
throw new
IllegalArgumentException

Για να πιάσετε αυτήν την εξαίρεση, πρέπει να πάτε όπου

someMethod()

καλείται και χρησιμοποιήστε το μπλοκ try-catch :

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
}
// ...
}

Τα πάντα μέσα στο προσπαθήστε το μπλοκ θα εκτελεστεί με τη σειρά μέχρι να γίνει εξαίρεση. Μόλις απορριφθεί μια εξαίρεση, όλες οι επόμενες δηλώσεις παραλείπονται και η λογική της εφαρμογής μεταβαίνει αμέσως στο σύλληψη ΟΙΚΟΔΟΜΙΚΟ ΤΕΤΡΑΓΩΝΟ.

Στο παράδειγμά μας, εισάγουμε το μπλοκ try και καλούμε αμέσως

someMethod()

Το Δεδομένου ότι το 200 δεν είναι μεταξύ 0 και 100, ένα

IllegalArgumentException

πετάγεται. Αυτό τερματίζει αμέσως την εκτέλεση του

someMethod()

, παραλείπει την υπόλοιπη λογική στο μπλοκ δοκιμής (

someOtherMethod()

δεν καλείται ποτέ) και συνεχίζει την εκτέλεση εντός του μπλοκ αλιευμάτων.

Τι θα γινόταν αν τηλεφωνούσαμε

someMethod(50)

αντι αυτου? ο

IllegalArgumentException

δεν θα πεταχτεί ποτέ.

someMethod()

θα εκτελεστεί κανονικά. Το μπλοκ δοκιμής θα εκτελείται κανονικά, καλώντας

someOtherMethod()

όταν ολοκληρωθεί κάποιαΜέθοδος (). Πότε

someOtherMethod()

τελειώνει, το μπλοκ αλιευμάτων θα παραλείπεται και

callingMethod()

θα συνέχιζε.

Σημειώστε ότι μπορείτε να έχετε πολλά μπλοκ αλιευμάτων ανά δοκιμαστικό μπλοκ:

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
} catch (NullPointerException e) {
// handle the exception in here
}
// ...
}

Σημειώστε επίσης ότι είναι προαιρετικό τελικά μπλοκ υπάρχει επίσης:

public void method() {
try {
// ...
} catch (Exception e) {
// ...
} finally {
// ...
}
}

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

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

Σημειώστε ότι μπορείτε να έχετε ένα τελικό μπλοκ χωρίς ένα μπλοκ αλιευμάτων:

public void method() {
try {
// ...
} finally {
// ...
}
}

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

Επιλεγμένες έναντι μη επιλεγμένων εξαιρέσεων στην Java

Σε αντίθεση με τις περισσότερες γλώσσες, η Java κάνει διάκριση μεταξύ ελεγμένες εξαιρέσεις και ανεξέλεγκτες εξαιρέσεις (π.χ. το C# έχει μόνο μη επιλεγμένες εξαιρέσεις). Ελεγμένη εξαίρεση πρέπει αλιεύονται στη μέθοδο όπου ρίχνεται η εξαίρεση ή αλλιώς ο κώδικας δεν θα μεταγλωττιστεί.

Για να δημιουργήσετε μια επιλεγμένη εξαίρεση, επεκτείνετε από

Exception

Το Για να δημιουργήσετε μια ανεξέλεγκτη εξαίρεση, επεκτείνετε από

RuntimeException

Το

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

IOException

είναι μια επιλεγμένη εξαίρεση, ο ακόλουθος κώδικας δεν θα μεταγλωττιστεί:

public void wontCompile() {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

Πρέπει πρώτα να δηλώσετε ότι εμφανίζει μια επιλεγμένη εξαίρεση:

public void willCompile() throws IOException {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

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

Πότε πρέπει να χρησιμοποιήσετε εξακριβωμένες ή μη επιλεγμένες εξαιρέσεις;

Η επίσημη τεκμηρίωση Java έχει ένα σελίδα σε αυτήν την ερώτηση Το Συνοψίζει τη διαφορά με έναν συνοπτικό κανόνα: «Εάν εύλογα αναμένεται ότι ένας πελάτης θα ανακάμψει από μια εξαίρεση, κάντε τον εξαίρεση που έχει ελεγχθεί. Εάν ένας πελάτης δεν μπορεί να κάνει τίποτα για να ανακάμψει από την εξαίρεση, κάντε το μια ανεξέλεγκτη εξαίρεση. '

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

Οδηγίες για τη χρήση εξαιρέσεων Java

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

  • Προτιμήστε συγκεκριμένες εξαιρέσεις από γενικές εξαιρέσεις. Χρήση | _+_ | πάνω | _+_ | όταν είναι δυνατόν, αλλιώς χρησιμοποιήστε το | _+_ | πάνω | _+_ | όταν είναι δυνατόν.
  • Ποτέ μην πιάσετε | _+_ | ! Το | _+_ | η τάξη επεκτείνεται στην πραγματικότητα | _+_ | , και το μπλοκ αλιευμάτων λειτουργεί στην πραγματικότητα με | _+_ | ή οποιαδήποτε κατηγορία που επεκτείνεται Throwable. Ωστόσο, το | _+_ | η τάξη επεκτείνεται επίσης | _+_ | , και δεν θέλετε ποτέ να πιάσετε ένα | _+_ | επειδή | _+_ | s υποδεικνύουν σοβαρά ανεπανόρθωτα ζητήματα.
  • Ποτέ μην πιάσετε | _+_ | ! | _+_ | επεκτείνεται | _+_ | , οπότε κάθε μπλοκ που πιάνει | _+_ | θα πιάσει επίσης | _+_ | , και αυτή είναι μια πολύ σημαντική εξαίρεση με την οποία δεν θέλετε να μπλέξετε (ειδικά σε εφαρμογές πολλαπλών νημάτων), εκτός εάν γνωρίζετε τι κάνετε. Εάν δεν γνωρίζετε ποια εξαίρεση πρέπει να πιάσετε, σκεφτείτε να μην πιάσετε τίποτα.
  • Χρησιμοποιήστε περιγραφικά μηνύματα για να διευκολύνετε τον εντοπισμό σφαλμάτων. Όταν ρίχνετε μια εξαίρεση, μπορείτε να δώσετε ένα | _+_ | μήνυμα ως επιχείρημα. Μπορείτε να έχετε πρόσβαση σε αυτό το μήνυμα στο μπλοκ αλιευμάτων χρησιμοποιώντας το | _+_ | μέθοδο, αλλά εάν η εξαίρεση δεν πιάσει ποτέ, το μήνυμα θα εμφανιστεί επίσης ως μέρος του ίχνους στοίβας.
  • Προσπαθήστε να μην πιάσετε και αγνοήσετε εξαιρέσεις. Για να ξεπεράσετε την ταλαιπωρία των επιλεγμένων εξαιρέσεων, πολλοί αρχάριοι και τεμπέληδες προγραμματιστές θα δημιουργήσουν ένα μπλοκ αλιευμάτων αλλά θα το αφήσουν κενό. Κακό! Να το χειρίζεστε πάντα με χάρη, αλλά αν δεν μπορείτε, εκτυπώστε τουλάχιστον ένα ίχνος στοίβας ώστε να γνωρίζετε ότι η εξαίρεση πετάχτηκε. Μπορείτε να το κάνετε χρησιμοποιώντας το | _+_ | μέθοδος.
  • Προσοχή στην υπερβολική χρήση εξαιρέσεων. Όταν έχεις σφυρί, όλα μοιάζουν με καρφί. Όταν μαθαίνετε για πρώτη φορά τις εξαιρέσεις, μπορεί να αισθάνεστε υποχρεωμένοι να μετατρέψετε τα πάντα σε εξαίρεση ... στο σημείο όπου το μεγαλύτερο μέρος της ροής ελέγχου της εφαρμογής σας καταλήγει σε χειρισμό εξαιρέσεων. Θυμηθείτε, οι εξαιρέσεις προορίζονται για «εξαιρετικά» περιστατικά!

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

Έχετε απορίες; Γνωρίζετε άλλες συμβουλές που σχετίζονται με τις εξαιρέσεις που έχασα; Μοιραστείτε τα στα παρακάτω σχόλια!

Μερίδιο Μερίδιο Τιτίβισμα ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ Πώς να δημιουργήσετε ένα διάγραμμα ροής δεδομένων για να απεικονίσετε δεδομένα οποιουδήποτε έργου

Τα διαγράμματα ροής δεδομένων (DFD) οποιασδήποτε διαδικασίας σάς βοηθούν να κατανοήσετε πώς τα δεδομένα ρέουν από την πηγή στον προορισμό. Δείτε πώς να το δημιουργήσετε!

Διαβάστε Επόμενο
Σχετικά θέματα
  • Προγραμματισμός
  • Ιάβα
Σχετικά με τον Συγγραφέα Τζόελ Λι(Δημοσιεύθηκαν 1524 άρθρα)

Ο Joel Lee είναι ο αρχισυντάκτης του MakeUseOf από το 2018. Έχει B.S. στην Επιστήμη των Υπολογιστών και πάνω από εννέα χρόνια επαγγελματικής εμπειρίας συγγραφής και επεξεργασίας.

πώς να κατεβάσετε το hbo δωρεάν
Περισσότερα από τον Joel Lee

Εγγραφείτε στο newsletter μας

Εγγραφείτε στο ενημερωτικό μας δελτίο για τεχνικές συμβουλές, κριτικές, δωρεάν ebooks και αποκλειστικές προσφορές!

Κάντε κλικ εδώ για εγγραφή