Αντικειμενοστραφής Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Ενότητα 7: Εξαιρέσεις (Exceptions), Εντοπισμός Σφαλμάτων (Debugging) Δρ. Χαράλαμπος Ζ. Πατρικάκης Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε Κάντε κλικ για να ξεκινήσετε
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Ευχαριστίες Στην ανάπτυξη του υλικού βοήθησαν οι φοιτητές Λάζαρος Τουμανίδης, Λίλιαν Γούσιου και ο βοηθός εργαστηρίου Κόγιας Δημήτριος. 4
Βιβλιογραφία Harvey Deitel,Paul Deitel, «Java Προγραμματισμός, 8η έκδοση», Γκιούρδας, 2010. Γιώργος Λιακέας, «Εισαγωγή στη Java», Κλειδάριθμος, 2009. Χρήστος Κυτάγιας, Κώστας Δ. Κυτάγιας, Γιώργος Πρεζεράκος, Δημήτρης Κυτάγιας, «Αντικειμενοστραφής Προγραμματισμός με Java», Σύγχρονη Εκδοτική, 2013. Wanda Dann, Stephen Cooper, and Randy Pausch, «Learning to program with Alice» 3rd edition, Pearson Education, 2012. Michael Kölling, «Introduction to Programming with Greenfoot». «Object-Oriented Programming in Java with Games and Simulations», Pearson Education, August 2009. Οι σημειώσεις είναι βασισμένες και σε υλικό του καθηγητή του ΤΕΙ Πειραιά Γ. Πρεζεράκου. 5
Περιεχόμενα 7.1 Εξαιρέσεις (Exceptions) 7.2 Εντοπισμός Σφαλμάτων (Debugging) 6
Προσδοκώμενα Αποτελέσματα Στην ενότητα αυτή θα μάθετε για: Τις εξαιρέσεις και ως τις αντιμετωπίζουμε σε ένα πρόγραμμα, Βασικά βήματα για τον εντοπισμό και την αντιμετώπιση σφαλμάτων στο πρόγραμμα. 7
7.1 Εξαιρέσεις (Exceptions) 8
Παραδείγματα Εξαιρέσεων (Exceptions) NullPointerException ArrayIndexOutOfBoundsException ClassCastException RuntimeException 9
Τί Είναι μία Εξαίρεση; Γεγονός που συμβαίνει όταν γίνεται κάτι απροσδόκητο - null.somemethod(); - (new int[1])[1] = 0; - int i = string ; 10
Γιατί Χρησιμοποιούμε μία Εξαίρεση; Για να πει σε ένα κώδικα που χρησιμοποιεί τη μέθοδο μας ότι κάτι πάει στραβά. Exception in thread "main" java.lang.arrayindexoutofboundsexception: 5 at RuntimeException.main(RuntimeException.java:8) - Δείκτης πρόσβασης σε στοιχείο = 5, ο οποίος δείχνει έξω από τα όρια του πίνακα - Μέθοδος που το κάλεσε : main 11
Πως Δημιουργούνται «Εξαιρέσεις» Όταν η Java δεν γνωρίζει τι θα κάνει, επομένως: Δημιουργεί ένα αντικείμενο Εξαίρεσης, Συμπεριλαμβάνει χρήσιμες πληροφορίες για αυτήν. «πετάει» (throws) την Εξαίρεση. Μπορείτε να δημιουργήσετε και να «πετάξετε» εξαιρέσεις (throw). Επίσης να δηλώσετε ποιες εξαιρέσεις θα πετάξετε (throws). 12
Public class Εξαίρεση Η Εξαίρεση είναι μία κλάση Στο παρακάτω παράδειγμα μόλις κληρονομήσατε από αυτή! { public class MyException extends Exception } Ή μπορείτε να χρησιμοποιήσετε μία ήδη υπάρχουσα Εδώ θα βρείτε μία λίστα: http://rymden.nu/exceptions.html 13
Προειδοποιήστε τη Java Σχετικά με την Εξαίρεση public Object get(int index) throws ArrayOutOfBoundsException { If (index < 0 index >= size()) throw new ArrayOutOfBoundsException( +index); } Η λέξη throws λέει στη Java ότι το αντικείμενο get μπορεί να εμφανίσει την Εξαίρεση ArrayOutOfBounds. Προσοχή μη μπερδέψετε το throws με το throw 14
Πιάνοντας μια Εξαίρεση Η Java τώρα περιμένει να βρει κώδικα, ο οποίος καλεί το get για να αντιμετωπίσει την εξαίρεση: - πιάνοντας την, - Πετώντας την. 15
Πιάνοντας μια Εξαίρεση Τι πρέπει να κάνουμε: -προσπαθούμε (try) να τρέξουμε κώδικα ο οποίος εμφανίζει μια εξαίρεση try { - και στη συνέχεια να πιάσουμε (catch)την εξαίρεση get(-1); } catch (ArrayOutOfBoundsException err) { } System.out.println( oh dear! ); 16
Πιάνοντας μια Εξαίρεση Μπορεί να θέλετε να δημιουργήσετε (να πετάξετε) εσείς μία εξαίρεση αντί να περιμένετε να εμφανιστεί. Ίσως επίσης δε θέλετε να αντιμετωπίσετε μία εξαίρεση. Πείτε στην Java ότι η μέθοδος σας την εμφανίζει void dobad() throws ArrayOutOfBoundsException { } get(-1); 17
Πετώντας μια Εξαίρεση 18
Πετώντας μια Εξαίρεση 19
Πετώντας μια Εξαίρεση 20
Πετώντας μια Εξαίρεση 21
Πετώντας μια Εξαίρεση 22
Πετώντας μια Εξαίρεση 23
Πετώντας μια Εξαίρεση 24
Πετώντας μια Εξαίρεση 25
Πετώντας μια Εξαίρεση 26
Πετώντας μια Εξαίρεση 27
Τι Συμβαίνει αν Κανείς δεν Αντιμετωπίσει την Εξαίρεση ; Αν τρέξετε public static void main(string[] args) throws Exception { dobad(); } Η Java τυπώνει το μήνυμα σφάλματος που βλέπετε Exception in thread "main" java.lang.arrayindexoutofboundsexception: -1 at YourClass.get(YourClass.java:50)at YourClass.doBad(YourClass.java:11)at YourClass.main(YourClass.java:10) 28
Περισσότερες Πληροφορίες; http://java.sun.com/docs/books/tutorial/essential/exceptions http://en.wikipedia.org/wiki/exceptions 29
7.2 Εντοπισμός Σφαλμάτων (Debugging) 30
Εντοπισμός Σφαλμάτων Η διαδικασία της εύρεσης και διόρθωσης ενός σφάλματος σε ένα πρόγραμμα. Μία θεμελιώδης δεξιότητα του προγραμματισμού. 31
Βήμα 1: Μην Κάνετε Λάθη Αρχικά μην εισάγετε σφάλματα. 32
Βήμα 1: Μην Κάνετε Λάθη Αρχικά μην εισάγετε σφάλματα. Επαναχρησιμοποίηση: Βρείτε έναν ήδη υπάρχοντα κώδικα που κάνει αυτό που θέλετε. Σχέδιο: σκεφτείτε πριν γράψετε τον κώδικα. Η καλύτερη εξάσκηση: Προτεινόμενη διαδικασία/τεχνική ώστε να αποφύγουμε συνήθη προβλήματα. 33
Σχέδιο: Ψευδοκώδικας Μία υψηλού επιπέδου κατανοητή περιγραφή του σκοπού που θέλουμε να έχει το πρόγραμμα. Μην ανησυχείτε για λεπτομέρειες του κώδικα αλλά για τη δομή του. 34
Ψευδοκώδικας: Έλεγχος Διαστήματος Παράδειγμα: Είναι ένας αριθμός στο διάστημα [x,y); Αν ισχύει αριθμός < x να επιστρέφει λανθασμένο. Αν ισχύει αριθμός >= y να επιστρέφει λανθασμένο. Αλλιώς να επιστρέφει αληθές. 35
Σχέδιο Εικονικό σχέδιο για αντικείμενα ή για το πώς λειτουργεί ένα πρόγραμμα. Μην ανησυχήσετε για μία συγκεκριμένη σημείωση, απλά να κάνετε κάτι που να έχει νόημα για εσάς. Τα άχρηστα χαρτιά είναι χρήσιμα. 36
Παράδειγμα 37
Βήμα 2: Βρείτε τα Σφάλματα Νωρίς Είναι πιο εύκολο να διορθώσουμε τα λάθη όσο πιο σύντομα τα βρούμε. Ελέγξτε το σχέδιο. Χρησιμοποιήστε εργαλεία για εντοπισμό πιθανών λαθών. Ελέγξτε την υλοποίηση σας. Ελέγξτε την εργασία σας βάζοντας συνθήκες. 38
Δοκιμή: Σημαντικοί Είσοδοι Θέλουμε να ελέγξουμε όλα τα μονοπάτια του προγράμματος. Σκεφτείτε ένα παράδειγμα για κάθε μονοπάτι. Παράδειγμα: Είναι ένας αριθμός στο διάστημα [x,y); 39
Διαστήματα: Σημαντικές Περιπτώσεις Κάτω από το χαμηλότερο όριο. Ίσο με το χαμηλότερο όριο. Μέσα στο διάστημα. Ίσο με το υψηλότερο όριο. Πάνω από το υψηλότερο όριο. 40
Διαστήματα: Σημαντικές Περιπτώσεις Τι συμβαίνει αν το χαμηλότερο όριο είναι μεγαλύτερο από το υψηλότερο; lower bound > upper bound Τι συμβαίνει αν το χαμηλότερο όριο ισούται με το υψηλότερο όριο; lower bound == upper bound 41
Ψευδοκώδικας: Έλεγχος Διαστήματος Είναι ένας αριθμός στο διάστημα [x,y); Είναι το 5 στο διάστημα [3,5); Αν ισχύει αριθμός < x να επιστρέφει λανθασμένο. Αν ισχύει αριθμός > y= να επιστρέφει λανθασμένο. Αλλιώς να επιστρέφει αληθές. 42
Ψευδοκώδικας: Έλεγχος Διαστήματος Είναι ένας αριθμός στο διάστημα [x,y); Είναι το 5 στο διάστημα [3,5); Αν ισχύει αριθμός < x να επιστρέφει λανθασμένο. Αν ισχύει αριθμός > y να επιστρέφει λανθασμένο. Αλλιώς να επιστρέφει αληθές. 43
Εργαλεία: Προειδοποιήσεις του Eclipse Προειδοποιήσεις: ίσως δεν πρόκειται για ένα σφάλμα, αλλά πιθανόν και να πρόκειται. Προτάσεις: πάντα πρέπει να διορθώνουμε τις προειδοποιήσεις. Επιπλέον έλεγχοι: FindBugs και σχετικά εργαλεία Έλεγχος ενότητας: Junit κάνει τον έλεγχο ευκολότερο 44
Εξακρίβωση Επαληθεύστε ότι ο κώδικας κάνει αυτό για το οποίο τον προορίζατε. Αν είναι σωστό: δε συμβαίνει τίποτα Αν είναι λάθος: το πρόγραμμα σταματάει με ένα σφάλμα Απενεργοποιημένη από προεπιλογή assert difference >= 0; 45
Παράδειγμα void printdifferencefromfastest(int[] marathontimes) { int fastesttime = findminimum(marathontimes); } for (int time : marathontimes) { int difference = time -fastesttime; assert difference >= 0; System.out.println("Difference: " + difference); } 46
Βήμα 3: Αναπαράγετε το Σφάλμα Υπολογίστε πώς να επαναλάβετε το σφάλμα. Δημιουργήστε μια σύντομη περίπτωση ελέγχου. Επιστρέψτε σε μία έκδοση που ήδη λειτουργεί και εισάγετε μία αλλαγή κάθε φορά μέχρι να επανέλθει το σφάλμα. Εξαλείψτε το επιπλέον υλικό που δε χρησιμοποιείται. 47
Βήμα 4: Δημιουργία Υπόθεσης Τι πηγαίνει στραβά; Τι μπορεί να έχει προκαλέσει το σφάλμα; Αμφισβητείστε τις παραδοχές: το x δεν είναι πιθανό: Αν οφείλεται σε κάτι άλλο; 48
Σε αυτή την ενότητα μιλήσαμε για: 7.1 Εξαιρέσεις (Exceptions) 7.2 Εντοπισμός Σφαλμάτων (Debugging) 50
Αντικειμενοστραφής Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Ενότητα 7: Εξαιρέσεις (Exceptions), Εντοπισμός Σφαλμάτων (Debugging) Δρ. Χαράλαμπος Ζ. Πατρικάκης Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε