Κεφάλαιο 4 Εξαιρέσεις
Όταν σε ένα πρόγραμμα συμβεί κάποιο λάθος, ο κώδικας εγείρει (throw) μία εξαίρεση. Στη Java oι εξαιρέσεις εκπροσωπούνται από αντικείμενα της κλάσης Exception ή υποκλάσεών της. Υποκλάσεις της Exception είτε προϋπάρχουν (πχ, IOException, NullPointerException) είτε ορίζονται από τον προγραμματιστή. Η έγερση εξαίρεσης θα έχει ως αποτέλεσμα τον τερματισμό του thread στο οποίο συνέβη το σφάλμα και θα τυπωθεί κάποιο μήνυμα. Σε προγράμματα μπορούν να ορισθούν χειριστές εξαιρέσεων (exception handlers). Εξαιρέσεις προκαλούνται από το runtime system, όπως στην περίπτωση διαίρεσης με το μηδέν.
Παράδειγμα δημιουργίας και έγερσης εξαίρεσης class MyException extends Exception { } class MyClass { void oops throws MyException( ) { if (some error condition) throw new MyException ( ); }
Try-catch-finally blocks Χρησιμοποιούνται για τη διαχείριση εξαιρέσεων try blocks: περιέχουν κώδικα που μπορεί να προκαλέσει εξαιρέσεις (συναρτήσεις που έχουν δηλωθεί ότι εγείρουν εξαιρέσεις ). catch blocs: εμπεριέχουν κώδικα που εκτελείται όταν εντοπιστεί η εξαίρεση που προορίζονται να εντοπίσουν. Σε ένα try block μπορούν να αντιστοιχούν πολλά catch blocks αναλόγως του πλήθους των εξαιρέσεων που μπορούν να εμφανιστούν στον κώδικα του try block. Αν η εξαίρεση που διαχειρίζεται ένα catch block είναι υπερκλάση άλλων εξαιρέσεων, το block παράλληλα διαχειρίζεται και όλες τις εξαιρέσεις υποκλάσεις. finally block: Περιέχει κώδικα που θα εκτελεστεί ανεξαρτήτως του αν θα παρουσιαστεί εξαίρεση ή όχι.
Παράδειγμα χειρισμού εξαίρεσης try { p.a = 10;} catch (NullPointerException e) { println("p was null"); } catch (Exception e) { println(“Some error message"); } finally { This code will always be executed. }
Παράδειγμα try { if (a == 10) { return; } } finally { print("finally"); } print("after try"); θα τυπώνει πάντα το μήνυμα "finally" αλλά το μήνυμα "after try" μόνο όταν a ≠ 10. Εντολή Finally Η finally εκτελείται ακόμα και όταν το try block περιέχει τις εντολές return, break, continue ή throw.
Μεταβίβαση εξαίρεσης στον επόμενο χειριστή Για, να περαστεί ο χειρισμός της εξαίρεσης στον επόμενο, exception handler, χρησιμοποιούμε την throw και για αντικείμενο εξαίρεσης την εξαίρεση που πιάσαμε. Έπειτα από το throw η εκτέλεση του τρέχοντος κώδικα χειρισμού διακόπτεται οριστικά. Παράδειγμα try { f.open ( ); } catch ( Exception e ) { f.close ( ); throw e; }