Εξαιρέσεις try, catch, finally, throw, throws
Εξαιρέσεις Πολλές φορές όταν προγραµµατίζουµε σε κάποια γλώσσα προγραµµατισµού συµβαίνουν διάφορα σφάλµατα που οφείλονται είτε σε διάφορες αιτίες όπως σε λάθη του προγραµµατιστή, ή σε λάθος δεδοµένα που δώθηκαν είτε από κάποιο χρήστη, είτε διαβάστηκαν από κάποιο αρχείο που περιείχε λάθη, ή σε συσκευές υλικού που δεν ανταποκρίνονται, ή σε συνδέσεις δικτύου που δεν µπορούν να πραγµατοποιηθούν κ.λπ. Στη java χρησιµοποιείται µία οµάδα κλάσεων που ονοµάζονται εξαιρέσεις οι οποίες χειρίζονται κάποιο σφάλµα. Η πρώτη κλάση είναιηthrowable, ηοποίαέχειδύοδευτερεύουσεςκλάσειςτην Error καιτην Exception, κάθεµιααπότιςοποίεςέχειάλλεςυποκλάσεις. Οι κλάσεις που παράγονται από την Error χρησιµοποιούνται για σηµαντικάλάθηόπωςτοναµηνυπάρχειάλληµνήµη ( OutOfMemoryError ) που δεν µπορούµε κατά κανόνα να κάνουµε κάτι γι αυτά. Η κλάση Exception είναι πιο ενδιαφέρουσα δεδοµένου ότιµπορείναπιάσειλάθηκαιναανακάµψειαπόαυτά. Παραδείγµαταυποκλάσεωντης Exception είναιγιαπαράδειγµαοι: ArrayIndexOutOfBoundsException, ArithmeticException, StringIndexOutOfBoundsException, NullPointerException.
Παραδείγµατα εξαιρέσεων κλάση εξαίρεσης
Παραδείγµατα εξαιρέσεων κλάση εξαίρεσης
Εξαίρεση-Αντικείµενο Μια εξαίρεση είναι ένα αντικείµενο. Άλλωστε τα ονόµατα των εξαιρέσεων είναι ονόµατα κλάσεων. Έτσι µια εξαίρεση είναι ένα αντικείµενο της αντίστοιχης κλάσης. Για παράδειγµα η κλάση ArrayIndexOutOfBoundsException. Στα προηγούµενα παραδείγµατα η java δηµιουργεί αυτόµατα ένα αντικείµενο της συγκεκριµένης κλάσης εξαίρεσης και σταµατά την εκτέλεση του προγράµµατος ενώ πετά το αντικείµενό (throws) και τυπώνει ένα µήνυµα λάθους. Κάποιες γνωστές εξαιρέσεις είναι οι ακόλουθες: ArithmeticException παράδειγµα η διαίρεση µε το 0. ArrayIndexOutOfBoundsException πρόσβαση σε στοιχείο πίνακα σε θέση που δεν υπάρχει StringIndexOutOfBoundsException για παράδειγµα αναφορά σε σύµβολοστην 10 η θέσηµιαςσυµβολοσειράςµε 8 θέσεις NullPointerException η εφαρµογή προσπαθεί να χρησιµοποιήσει ένα αντικείµενο που είναι null
Object Οι κλάσεις που παράγονται από την Error χρησιµοποιούνται για σηµαντικά λάθη του συστήµατος απόταοποίαδενµπορούµενα ανακάµψουµε. π.χ. δενυπάρχει άλλη µνήµη Error Throwable Exception. RuntimeException ArrayIndexOutOfBounds Exception ArithmeticE xception StringIndexOutOfBound sexception
Προτάσεις try και catch Για να προστατευθεί ο κώδικας που µπορεί να περιέχει κάποιο σφάλµατονβάζουµεσεέναµπλόκ try. Αν προκληθεί στο συγκεκριµένο κοµµάτι του κώδικα κάποιο σφάλµα η catch τοπιάνεικαιτοχειρίζεται. Ένα κοµµάτι κώδικα σε try και catch αν δηµιουργηθεί εξαίρεση στο try τότε εκτελείται το catch κοµάτι διαφορετικά ο κώδικας δεν µπαίνει µέσα στο catch αλλά συνεχίζει σαν να µην υπήρχε το catch και try. Τοκοµάτιτουκώδικαστο try µπαίνειµέσασεάγγιστρα { }. Η catch είναι περίπου όπως µία µέθοδος δηλαδή ακολουθούν παρενθέσεις και το σώµα σε άγγιστρα. Στην παρένθεση µπαίνει το όνοµα της κλάσης της εξαίρεσης που θα πιαστεί και ακολουθεί το όνοµα µιας µεταβλητής. Μέσα στο catch µπορώ να αναφερθώ στο αντικείµενο αυτό. Ο συνηθέστερος τρόπος χρήσης του αντικειµένου αυτού είναι να κληθεί η µέθοδος getmessage(). Η µέθοδος αυτή υπάρχει σε όλες τις εξαιρέσεις και εµφανίζει ένα λεπτοµερές µήνυµα σφάλµατος.
Παραδείγµατα try catch Το 3 είναιτοπλήθοςτων στοιχείων του πίνακα
Πολλαπλά catch Πολλές φορές στο ίδιο κοµάτι κώδικα χρειάζεται να βάλω πιο πολλές από µία εξαιρέσεις στο catch. Εδώ διακρίνουµε δύο περιπτώσεις: Οι κλάσεις να είναι στην ίδια ιεραρχία. Στην περίπτωση αυτή µπορώ να χρησιµοποιήσω µια υπερκλάση όλων αυτών των κλάσεων που θαήθελαναέχωστο catch. Οι κλάσεις να µην είναι στην ίδια ιεραρχία. Στην περίπτωση αυτή µπορώναχρησιµοποιήσωτόσα catch όσεςκαιοιεξαιρέσεις. Στα παραδείγµατα που ακολουθούν χρησιµοποιούνται είτε πολλά catch είτε ένα catch µιας υπερκλάσης των εξεραίσεων που προκαλούνται από κάθε catch της περίπτωσης των πολλών catch.
Παράδειγµα µε πολλά catch Ανοχρήστηςδώσει 2 τιµές (αντί 3) καιηδεύτερηείναιτο 0 τότεέχωλάθοςκαιστα όριατουπίνακακαιστηδιαίρεσηµετο 0. Όταν έχω πολλά catch εκτελείται το πρώτο που θα βρεθεί και τα άλλα αγνοούνται
Παράδειγµα µε πολλαπλό catch Ανοχρήστηςδώσει 2 τιµές (αντί 3) καιηδεύτερηείναιτο 0 τότεέχωλάθοςκαισταόρια τουπίνακακαιστηδιαίρεσηµετο 0.
Η πρόταση finally Κάποιες φορές είναι απαραίτητο να εκτελεστούν κάποιες ενέργειες στοπρόγραµµαανεξάρτητααπότοτιθασυµβείανπροκληθείήόχι µία εξαίρεση. Τέτοιες περιπτώσεις συνήθως παρουσιάζονται όταν για παράδειγµα θέλουµε να ελευθερωθεί κάποιος εξωτερικός πόρος αφού χρησιµοποιηθεί. Όπως όταν έχουµε ανοίξει κάποιο αρχείο και αυτό θα πρέπει να κλείσει σωστά. Στις περιπτώσεις αυτές χρησιµοποιούµετηνπρόταση finally. try { διάβασµα αρχείου... } catch (εξαίρεσηόνοµαµεταβλητής) { } finally { } χειρισµός σφάλµατος... κλείσιµο αρχείου... Η πρόταση finally µπορεί να χρησιµοποιηθεί χωρίς να υπάρχει η πρόταση catch. Εποµένωςηπρόταση try µπορείναέχει catch προτάσεις, µπορεί να έχει catch προτάσεις και finally πρόταση και τέλος µπορεί να έχει µόνο finally πρόταση. Ένα τέτοιο παράδειγµα δίνεται στη συνέχεια:
Παράδειγµα try finally Αποτέλεσµα 0 10 17 13 29 38 2 25 ** 120 112 15 19 24 20 30 12 ** 106 25 125 69 176 **
Object Implicit Exceptions Error Throwable Exception Explicit Exceptions. RuntimeException ArrayIndexOutOf BoundsException Arithmetic Exception StringIndexOutOf BoundsException
ήλωση εξαίρεσης σε µέθοδο Οι περισσότερες εξαιρέσεις εγείρονται αυτόµατα από το περιβάλλον της γλώσσας (implicit exceptions). Τις explicit εξαιρέσεις τις προκαλούν οι µεθοδοί µας. Για να δηλώσουµε πως η µέθοδός µας µπορεί να προκαλέσει µία ή περισσότερες εξαιρέσεις χρησιµοποιούµε τη λέξη κλειδί throws και ακολουθούν τα ονόµατα των εξαιρέσεων χωρισµένα µε κόµατα. Ο τρόπος που δηλώνεται αυτό είναι: τροποποιητές τύπος επιστροφής όνοµα µεθόδου (λίστα παραµέτρων) throws όνοµα εξαίρεσης 1, όνοµα εξαίρεσης 2,... { σώµα της µεθόδου } Για παράδειγµα: public int mymethodos (int a, int b) throws NumberFormatException, EOFException {... κυρίως σώµα της µεθόδου... } Όπως ακριβώς συµβαίνει µε την catch υπάρχει η δυνατότητα όταν στη λίστα των ονοµάτων των εξαιρέσεων υπάρχουν κάποιες που έχουν κοινή υπερκλάση να χρησιµοποιηθεί το όνοµα της υπερκλάσης αντί των πολλών ονοµάτων των υποκλάσεων
Πρόκληση(έγερση) εξαίρεσης Αν σε µια µέθοδο δηλωθεί πως προκαλεί εξαίρεση τότε µπορεί να συµβούν τα εξής: Η µέθοδος προκαλεί η ίδια εξαίρεση χρησιµοποιώντας την λέξη κλειδί throw στο σώµα της (άµεση πρόκληση) Για παράδειγµα: Exception nea = new Exception( ); throw nea; Εποµένως στο σώµα της µεθόδου έχουµε public methodos (παράµετροι) throws Exception{ throw new Exception( ); } ή throw new Exception( ); Καλεί στο σώµα της µέθοδο η οποία προκαλεί εξαίρεση την οποία όµως δεν χειρίζεται η ίδια αλλά η καλούσα (έµµεση πρόκληση) Για παράδειγµα: public methodos(παράµετροι) throws MalformedURLException { } Όποια µέθοδος καλέσει την methodos θα πρέπει να προκαλέσει την εξαίρεση
ηµιουργία Εξαιρέσεων από τον χρήστη Για να δηµιουργήσει κάποιος χρήστης τις δικές του εξαιρέσεις πρέπειναλάβειυπόψητουταεξής: Η νέα εξαίρεση θα πρέπει να είναι υποκλάση της κλάσεως Exception ή κάποιας από τις υποκλάσεις της Οικλάσειςεξαιρέσεωνέχουνσυνήθωςδύοµεθόδουςδηµιουργούς. Οέναςδενθαέχειόρισµακαιοάλλοςθαέχεισανόρισµαµια συµβολοσειρά Η συµβολοσειρά θα πρέπει να χρησιµοποιηθεί στη σωστή θέση µέσα στην εξαίρεση και γι αυτό καλούµε την super µε παράµετρο την συµβολοσειρά Για παράδειγµα public class NewException extends Exception { } public NewException( ){ } public NewException( ) (String message) { } super (message);