Διαφήμιση

Μια εξαίρεση στον προγραμματισμό σημαίνει μια εξαιρετική συνθήκη σε κάποιο σημείο της εκτέλεσης του προγράμματος. Χρησιμοποιείται όταν η εξαιρετική κατάσταση μπορεί να αντιμετωπιστεί καλύτερα αλλού και όχι όπου αντιμετωπίζεται. Εξετάστε τα ακόλουθα παραδείγματα:

  • Η αποτυχία ανοίγματος ενός αρχείου διαμόρφωσης μπορεί να αντιμετωπιστεί καλύτερα στον κώδικα, ίσως χρησιμοποιώντας μια εναλλακτική τοποθεσία του αρχείου διαμόρφωσης.
  • Πρόσβαση σε ένα είδος πίνακα Πώς να χρησιμοποιήσετε ένα Java ArrayListΜια λίστα πίνακα Java είναι ένας πίνακας με δυνατότητα αλλαγής μεγέθους γενικής χρήσης. Παρέχει τις περισσότερες από τις εγκαταστάσεις που αναμένεται γενικά για συστοιχίες σε άλλες γλώσσες. Σε αυτό το άρθρο θα μάθετε να ρυθμίζετε και να χρησιμοποιείτε μια λίστα πίνακα. Διαβάστε περισσότερα έξω από τα όρια του πίνακα σημαίνει σφάλμα προγράμματος. Καλό σφάλμα εντοπισμού σφαλμάτων!
  • Ένα σφάλμα ανάλυσης XML πρέπει να γνωστοποιηθεί στον χρήστη, έτσι ώστε το αρχείο XML να μπορεί να διορθωθεί.
  • Το πρόγραμμα που εξαντλείται από τη μνήμη (ίσως κατά την επεξεργασία ενός μεγάλου αρχείου) μπορεί να διορθωθεί αυξάνοντας ίσως την ποσότητα μνήμης που είναι διαθέσιμη στη διαδικασία java.
    instagram viewer

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

Τύποι εξαιρέσεων

Η παρακάτω εικόνα δείχνει τα κύρια μέρη της Ιεραρχίας εξαίρεσης Java. Η βασική τάξη είναι Ρίξιμο η οποία υποδιαιρείται σε Εξαίρεση και Λάθος. Τάξη Εξαίρεση είναι για τις σχετικές με το πρόγραμμα συνθήκες που οι εφαρμογές μπορούν να πιάσουν σε μια προσπάθεια διάσωσης της κατάστασης. Τάξη Λάθος, από την άλλη πλευρά, είναι για την ένδειξη σοβαρών σφαλμάτων στο περιβάλλον εκτέλεσης Java, τα οποία οι εφαρμογές δεν πρέπει να εντοπίσουν. Μερικά παραδείγματα είναι: Σφάλμα OutOfMemory και Σφάλμα StackOverflow.

Ιεραρχία εξαίρεσης

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

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

Η ακόλουθη μέθοδος επιχειρεί να δημιουργήσει Αναγνώστης αρχείων από ένα αρχείο. Ο κατασκευαστής ρίχνει μια ελεγμένη εξαίρεση FileNotFoundException το οποίο πρέπει να αντιμετωπιστεί από τον κωδικό κλήσης ή να δηλωθεί ότι θα ρίξει.

Ο ακόλουθος κωδικός θα δεν μεταγλωττίστε γιατί δεν κάνει κανένα.

private void loadFile (Όνομα αρχείου συμβολοσειράς) {FileReader in = νέο FileReader (όνομα αρχείου); }

Ένας τρόπος για να λάβετε τον κώδικα για να μεταγλωττίσετε είναι να χειριστείτε την εξαίρεση (δείτε παρακάτω).

private void loadFile (Όνομα αρχείου συμβολοσειράς) {δοκιμάστε {FileReader in = new FileReader (όνομα αρχείου)); {} catch (FileNotFoundException ex) {// χειριστείτε την εξαίρεση εδώ} }

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

private void loadFile (String όνομα αρχείου) ρίχνει το java.io. FileNotFoundException. {FileReader in = νέο FileReader (όνομα αρχείου)); { }

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

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

ιδιωτική κενή λαβήΕκδήλωση () {String name = null; εάν (name.length ()> 0) {} }

Εξαιρέσεις περιτυλίγματος

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

Το ακόλουθο παράδειγμα κώδικα έδειξε πώς να τυλίξετε μια εξαίρεση. Η μέθοδος μέθοδος_1 () ρίχνει ένα SQLException στο σώμα του. Προκειμένου ο κώδικας να μεταγλωττιστεί σωστά, η εξαίρεση πρέπει να δηλωθεί ως πεταμένη.

private void method_1 () ρίχνει το SQLException {... ρίξτε νέο SQLException; }

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

private void method_2 () {δοκιμάστε {method_1 (); } αλίευση (java.sql. SQLException ex) {ρίξτε νέο RuntimeException (ex); } }

Εξαίρεση Stack Trace

Το Exception Stack Trace αναφέρεται στη συστοιχία ενεργών πλαισίων στοίβας, καθένα από τα οποία αντιπροσωπεύει μια επίκληση μεθόδου, η οποία καταγράφηκε από το JVM τη στιγμή που έγινε η εξαίρεση. Κάθε πλαίσιο στοίβας περιλαμβάνει τη θέση της επίκλησης μεθόδου, συμπεριλαμβανομένου του ονόματος κλάσης, του ονόματος μεθόδου και πιθανώς του ονόματος αρχείου προέλευσης java και του αριθμού γραμμής μέσα στο αρχείο. Είναι χρήσιμο για τον εντοπισμό της ακολουθίας κλήσεων που προκάλεσε το σφάλμα Εξαιρέσεις Java: Τους χειρίζεστε σωστά;Μια εξαίρεση στον προγραμματισμό σημαίνει μια εξαιρετική συνθήκη στην εκτέλεση του προγράμματος. Χρησιμοποιείται όταν η κατάσταση μπορεί να αντιμετωπιστεί καλύτερα αλλού. Εξετάστε τα ακόλουθα παραδείγματα χειρισμού εξαιρέσεων Java. Διαβάστε περισσότερα .

Εδώ είναι ένα τυπικό ίχνος στοίβας, που λαμβάνεται από το αντικείμενο εξαίρεσης όταν πιάστηκε.

Εξαίρεση στο νήμα "main" java.lang. IndexOutOfBoundsException: Ευρετήριο: 8, Μέγεθος: 5 στο java.util. ArrayList.rangeCheck (ArrayList.java: 653) στο java.util. ArrayList.get (ArrayList.java: 429) στο sample.sample1.main (sample1.java: 24)

Η εξαίρεση που υπάρχει εδώ είναι IndexOutOfBoundsException. Περιλαμβάνει πρόσθετες πληροφορίες σχετικά με το σφάλμα. Το ίχνος στοίβας περιέχει 3 καρέ στοίβας, καθένα από τα οποία περιλαμβάνει τις πληροφορίες τοποθεσίας όπως φαίνεται.

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

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

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

private void loadConfig () {try {// invoke code που μπορεί να δημιουργήσει ένα IOException} catch (java.io. IOException ex) {// χειριστείτε την εξαίρεση εδώ. Μπορεί να συνδεθεί σε αρχείο καταγραφής. log.warning (ex.getMessage ()); } }

Όταν μια εξαίρεση τυλίγεται μέσα σε μια άλλη, μπορείτε να ανακτήσετε την τυλιγμένη εξαίρεση:

Πιθανή αιτία = ex.getCause (); log.warning ("Υποκείμενη αιτία:" + menyebabkan.getMessage ()); 

Πρέπει να έχετε πρόσβαση στο ίχνος στοίβας και ίσως να εξαγάγετε το όνομα της μεθόδου που το προκάλεσε;

StringBuilder sbuf = νέο StringBuilder ("Stack Trace:"); για (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); } log.warning (sbuf.toString ());

Ή ίσως, να καταγράψετε την εξαίρεση και να την ανακαλύψετε ξανά;

προσπαθήστε {... } αλίευση (java.io. IOException ex) {log.warning (ex.getMessage ()); ρίξτε πρώην; }

ο Εξαίρεση τάξη παρέχει ένα printStackTrace () μέθοδος που μπορεί να εκτυπώσει το ίχνος στοίβας στο δικό σας PrintStreamΕκτύπωση).

προσπαθήστε {... } αλίευση (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (έξω); }

Μπορείτε να εντοπίσετε πολλούς τύπους εξαιρέσεων σε ένα μόνο προσπαθήστε αποκλεισμός και εκτέλεση συγκεκριμένου χειρισμού για κάθε τύπο εξαίρεσης.

δοκιμάστε {// ρίχνει μερικές εξαιρέσεις εδώ. } αλίευση (java.io. IOException ex) {// Ειδικός χειρισμός IOException εδώ. } αλίευση (java.sql. SQLException ex) {// SQLException ειδικός χειρισμός εδώ. }

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

δοκιμάστε {// ρίχνει μερικές εξαιρέσεις εδώ. } αλίευση (java.io. IOException | java.sql. SQLException ex) {// IOException και SQLException ειδικός χειρισμός εδώ. } catch (SAXException ex) {// SAXException συγκεκριμένος χειρισμός εδώ. }

Καθαρισμός πόρων με επιτέλους

Όταν ασχολείστε με κώδικα που μπορεί να ρίξει εξαιρέσεις, είναι σημαντικό να εκτελέσετε σωστή εκκαθάριση οποιωνδήποτε πόρων, όπως ανοιχτά αρχεία Όλα όσα πρέπει να γνωρίζετε για τις μορφές αρχείων και τις ιδιότητές τουςΧρησιμοποιούμε το αρχείο λέξεων εναλλακτικά: μουσική, εικόνα, υπολογιστικό φύλλο, προβολή διαφανειών και ούτω καθεξής. Αλλά τι κάνει ένα αρχείο "αρχείο" ούτως ή άλλως; Ας προσπαθήσουμε να κατανοήσουμε αυτό το θεμελιώδες μέρος της πληροφορικής. Διαβάστε περισσότερα , συνδέσεις βάσης δεδομένων κ.λπ. Η εκκαθάριση πόρων πρέπει να εκτελείται σε ένα τελικά ΟΙΚΟΔΟΜΙΚΟ ΤΕΤΡΑΓΩΝΟ. Με αυτόν τον τρόπο τόσο η κανονική έξοδος όσο και η εξαιρετική έξοδος από ένα μπλοκ επικαλούνται το κωδικός καθαρισμού Τα 10 χειρότερα λάθη προγραμματισμού στην ιστορίαΣτο ιστορικό του παρελθόν, κωδικοποίησε επίσης την καταστροφή. Οι εμφανίσεις λίγο κακού κώδικα προκάλεσαν καταστροφή σε σημαντικό επίπεδο. Τα παρακάτω είναι 10 από τα χειρότερα λάθη προγραμματισμού στην ιστορία. Διαβάστε περισσότερα .

InputStream σε = null; προσπαθήστε {... σε = νέο FileInputStream (όνομα αρχείου);... } αλίευση (java.io. IOException ex) {log.warning (ex.getMessage ()); } τέλος {// ο κώδικας εδώ εκτελείται κατά την έξοδο από το μπλοκ δοκιμής, // είτε κανονικά είτε λόγω εξαίρεσης εάν (in! = null) in.close (); }

Μπλοκ Try-With-Resources

Η Java 1.7 εισήγαγε το δοκιμάστε με πόρους κατασκευή που καθιστά ευκολότερη την εκκαθάριση πόρων. Μοιάζει με αυτό:

δοκιμάστε (InputStream in = new FileInputStream (..)) {// κώδικα που χρησιμοποιεί το InputStream. }

Όταν ο κωδικός βγαίνει από το μπλοκ (είτε καθαρά είτε λόγω εξαίρεσης), το InputStream η μεταβλητή καθαρίζεται αυτόματα.

Εκκαθάριση πολλών πόρων, δηλώνοντας όλα αυτά στο κεφάλι του μπλοκ.

δοκιμάστε (InputStream in = new FileInputStream (..); Σύνδεση con =...; ) {// κωδικός που χρησιμοποιεί το InputStream και τη σύνδεση. }

Οποιοδήποτε αντικείμενο του οποίου η κλάση εφαρμόζει το Αυτόματο κλείσιμο διεπαφή μπορεί να καθαριστεί με αυτόν τον τρόπο. Η ακόλουθη τάξη εκτελεί κάποια συγκεκριμένη εκκαθάριση στο Κλείσε() μέθοδος.

δημόσια κλάση MyClass εφαρμόζει το AutoCloseable {public void close () {// κωδικός καθαρισμού εδώ} }

Χρησιμοποιήστε μια παρουσία αυτής της τάξης στο a δοκιμάστε με πόρους ΟΙΚΟΔΟΜΙΚΟ ΤΕΤΡΑΓΩΝΟ.

δοκιμάστε (MyClass obj = νέο MyClass (..)) {// κώδικα που χρησιμοποιεί το αντικείμενο MyClass. }

Μερικές συνήθεις εξαιρέσεις

Ας ρίξουμε μια ματιά σε μερικές εξαιρέσεις που απαντώνται συνήθως.

  • IndexOutOfBoundsException (μη επιλεγμένο): υποδεικνύει ότι ο δείκτης του στοιχείου στο οποίο έχει πρόσβαση είναι εκτός των ορίων ενός πίνακα, συμβολοσειράς κ.λπ.
  • SQLException (επιλεγμένο): ρίχτηκε λόγω σφάλματος στη βάση δεδομένων.
  • IOException (επιλεγμένο): σφάλμα πρόσβασης αρχείου ή σφάλματα που σχετίζονται με την είσοδο και την έξοδο.
  • InterruptException (επιλεγμένο): ρίχνεται όταν διακόπτεται η εκτέλεση του νήματος.
  • SAXException (επιλεγμένο): ρίχτηκε λόγω σφαλμάτων ανάλυσης XML.
  • NullPointerException (μη επιλεγμένο): χρήση μηδενικού όπου απαιτείται αντικείμενο.

Τυλίγοντας

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

Έχετε ιστορίες πολέμου που σχετίζονται με τις εξαιρέσεις; Εάν ναι, πείτε μας σχετικά με την παρακάτω ενότητα σχολίων.

Πιστωτική εικόνα: Ντμίτρι Νικολάεφ μέσω του Shutterstock.com