Η Java συλλαμβάνει πολλές εξαιρέσεις

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

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

Ας πάρουμε ένα παράδειγμα.

Παράδειγμα 1: Πολλά μπλοκ αλιευμάτων

 class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException e) ( System.out.println(e.getMessage()); ) catch (ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) ) 

Παραγωγή

 / με μηδέν 

Σε αυτό το παράδειγμα, ενδέχεται να προκύψουν δύο εξαιρέσεις:

  • ArithmeticException γιατί προσπαθούμε να διαιρέσουμε έναν αριθμό με 0.
  • ArrayIndexOutOfBoundsException επειδή έχουμε δηλώσει έναν νέο ακέραιο πίνακα με όρια συστοιχίας 0 έως 9 και προσπαθούμε να αντιστοιχίσουμε μια τιμή στο ευρετήριο 10.

Εκτυπώνουμε το μήνυμα εξαίρεσης και στα δύο catchμπλοκ, δηλαδή σε διπλό κώδικα.

Η συσχέτιση του χειριστή ανάθεσης =είναι δεξιά προς τα αριστερά, οπότε ένα ArithmeticExceptionρίχνεται πρώτο με το μήνυμα / από το μηδέν.

Χειριστείτε πολλές εξαιρέσεις σε ένα μπλοκ catch

Στην Java SE 7 και μεταγενέστερη έκδοση, μπορούμε πλέον να πιάσουμε περισσότερους από έναν τύπους εξαιρέσεων σε ένα μόνο catchμπλοκ.

Κάθε τύπος εξαίρεσης που μπορεί να αντιμετωπιστεί από το catchμπλοκ διαχωρίζεται χρησιμοποιώντας κάθετη ράβδο ή σωλήνα |.

Η σύνταξή του είναι:

 try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block ) 

Παράδειγμα 2: Πολλαπλό μπλοκ

 class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) ) 

Παραγωγή

 / με μηδέν 

Η σύλληψη πολλαπλών εξαιρέσεων σε ένα μόνο catchμπλοκ μειώνει την αναπαραγωγή κώδικα και αυξάνει την αποδοτικότητα.

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

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

Εξαίρεση βάσης αλίευσης

Όταν εντοπίζετε πολλές εξαιρέσεις σε ένα μόνο catchμπλοκ, ο κανόνας γενικεύεται σε εξειδικευμένο.

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

Ας πάρουμε ένα παράδειγμα.

Παράδειγμα 3: Μόνο κατηγορία κατηγορίας εξαίρεσης βάσης

 class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception e) ( System.out.println(e.getMessage()); ) ) ) 

Παραγωγή

 / με μηδέν 

Γνωρίζουμε ότι όλες οι κατηγορίες εξαίρεσης είναι υποκατηγορίες της Exceptionκατηγορίας. Έτσι, αντί να πιάσουμε πολλές εξειδικευμένες εξαιρέσεις, μπορούμε απλά να πιάσουμε την Exceptionτάξη.

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

Ας πάρουμε ένα παράδειγμα.

Παράδειγμα 4: Μαθήματα βάσης αλίευσης και εξαίρεσης παιδιών

 class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) ) 

Παραγωγή

 Main.java:6: σφάλμα: Οι εναλλακτικές λύσεις σε μια δήλωση πολλαπλών αλιευμάτων δεν μπορούν να σχετίζονται με την υποκατηγορία 

Σε αυτό το παράδειγμα, ArithmeticExceptionκαι ArrayIndexOutOfBoundsExceptionείναι και οι δύο υποκατηγορίες της Exceptionκλάσης. Λοιπόν, έχουμε ένα σφάλμα συλλογής.

ενδιαφέροντα άρθρα...