Σε αυτό το σεμινάριο, θα μάθουμε να χειριζόμαστε πολλές εξαιρέσεις στην 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
κλάσης. Λοιπόν, έχουμε ένα σφάλμα συλλογής.