Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές τύπων, δημιουργία τυχαίων αριθμών, λήψη εισόδου από χρήστη
Λογικά λάθη public class ShowLogicErrors { /* Είναι ένας αριθμός μεταξύ 1 και 100; (συμπεριλαμβανομένων αυτών) */ public static void main(string[] args) { // Ζήτησε από το χρήστη να δώσει ένα αριθμό String input = JOptionPane.showInputDialog(null, "Δώσε έναν ακέραιο:", "ShowLogicErrors", JOptionPane.QUESTION_MESSAGE); int number = Integer.parseInt(input); } // Εμφάνισε το αποτέλεσμα System.out.println("Ο αριθμός είναι μεταξύ 1 και 100, συμπεριλαμβανομένων αυτών;" + ((1 < number) && (number < 100))); System.exit(0); }
Αποσφαλμάτωση (Debugging) Τα λογικά σφάλματα ονομάζονται bugs. Ηδιαδικασία εντοπισμού και διόρθωσης σφαλμάτων ονομάζεται αποσφαλμάτωση (debugging). Μία κοινή πρακτική για debugging είναι να στενέψεις (επικεντρώσεις την προσοχή σου) την περιοχή του κώδικα όπου βρίσκεται το bug. Μπορείς να: κλείσεις σε σχόλια (να απενεργοποιήσεις) μέρη κώδικα ώστε να εκτελείται ένα μικρότερο μέρος του κώδικα να εκτυπώνεις μηνύματα εμφανίζοντας τις τιμές κάποιων μεταβλητών ή απλά για να παρακολουθείς τη ροή εκτέλεσης του προγράμματος Αυτό μπορεί να δουλέψει για μικρά, απλά προγράμματα. Σε πολύπλοκα προγράμματα είναι απαραίτητη η χρήση ειδικών προγραμμάτων αποσφαλμάτωσης (debuggers)
Αποσφαλματωτής (Debugger) Ο debugger είναι ένα πρόγραμμα που διευκολύνει την αποσφαλμάτωση. Μπορείτε να χρησμοποιήσετε τον debugger ώστε να: Εκτελείται μία δήλωση σε κάθε βήμα Να παρακολουθείτε την εκτέλεση των δηλώσεων μίας μεθόδου μία προς μία ή να εκτελείτε τη μέθοδο σε ένα μόνο βήμα Να θέσετε σημεία του κώδικα στα οποία να «παγώνει» η εκτέλεσή του (breakpoints) Να εμφανίζετε τις τιμές μεταβλητών (watch) Να εμφανίζετε τη στοίβα κλήσεων (call stack) Να τροποποιείτε τις τιμές μεταβλητών
Παράδειγμα αποσφαλμάτωσης Προσθέστε στο project σας την κλάση DebuggerClass η οποία πρέπει να γίνει η κύρια κλάση του project (επιλέξτε Set Configuration > Customize)
Παράδειγμα αποσφαλμάτωσης Επιλέξτε Browse > DebuggerClass
Παράδειγμα αποσφαλμάτωσης Επιλέξτε Browse, την DebuggerClass και το πλήκτρο Select Main Class
Παράδειγμα αποσφαλμάτωσης 1. Εκτελέστε το πρόγραμμα βήμα προς βήμα Πατώντας το πλήκτρο F7 θα παρακολουθήσετε και τις κλήσεις σε μεθόδους (είτε ορισμένες από εσάς είτε μεθόδους «έτοιμων» κλάσεων της Java Πατώντας το πλήκτρο F8 οι μέθοδοι εκτελούνται σε ένα μόνο βήμα 2. Επαναλάβατε το debugging, αλλάγειαναεπιταχύνετετην εκτέλεση του κώδικα, ορίστε 2 breakpoints (κάνοντας κλικ πάνω στον αριθμό της γραμμής κώδικα) Μετά το ορισμό των breakpoints, πατήστε Control F5 για να ξεκινήσει το debugging (η εκτέλεση θα φτάσει μέχρι το πρώτο breakpoint) και F5 για να συνεχίστε μέχρι το επόμενο breakpoint 3. Επαναλάβατε το debugging αλλά προσθέστε ένα watch για να παρακολουθήσετε την τιμή της μεταβλητής square.
Ορισμός Breakpoints Ένα breakpoint ορίζει μία παύση σε μια συγκεκριμένη γραμμή κώδικα. Ο debugger εκτελεί κάθε γραμμή κώδικα μέχρι να συναντήσει ένα breakpoint Με τη χρήση breakpoints, μπορείτε να αποφύγετε τη βήμαπρος βήμα εκτέλεση τμημάτων κώδικα που ξέρετε ότι δουλεύουν σωστά και να επικεντρώσετε στα τμήματα που δημιουργούν πρόβλημα Ενεργοποιείτε/απενεργοποιείτε breakpoints κάνοντας κλικ πάνω στον αριθμό της γραμμής κώδικα
Variables\Watches View Επιλέγοντας το φύλλο (tabs) Variables μπορώ να παρακολουθήσω τις τιμές που παίρνουν όλες οι μεταβλητές του προγράμματος Εφόσον με ενδιαφέρει η τιμή μιας συγκεκριμένης μεταβλητής (π.χ. i) ή μιαςέκφρασης(π.χ. i+ i/5) μπορώναπροσθέσωένα watch (Debug > New watch) και να παρακολουθήσω την τιμή του από το Watches tab.
Άσκηση #1 Χρησιμοποιήστε τον debugger του NetBeans για να βρείτε το λογικό σφάλμα του προγράμματος DebuggerClass.java Τρέξτε το πρόγραμμα βήμα βήμα και παρακολουθήστε τις τιμές που παίρνουν οι μεταβλητές του Ορίστε δύο breakpoints και επαναλάβατε Ορίστε ένα watch (την τιμή της square) και επαναλάβατε
Άσκηση #2 Γράψτε ένα Java πρόγραμμα που να κάνει τα εξής: 1. Γνωρίζοντας ότι μέσα στην κλάση Float ορίζεται ο μέγιστος και ο ελάχιστος αριθμός τύπου float, να τυπώνει τη μέγιστη και την ελάχιστη τιμή που μπορεί να λάβει ένας αριθμός τύπου float. 2. Μετατρέψτε τον 234.567 (α) σε απλό ακέραιο int, (β) τον ακέραιο σε String, (γ) το String σε πραγματικό διπλής ακρίβειας double, (δ) το αποτέλεσμα σε αντικείμενο Double. Σε κάθε βήμα να τυπώνετε τα αποτελέσματα. Παρατηρείτε καμιά αλλαγή;
Άσκηση #2 (συνέχεια) 4. Να τυπώνει έναν τυχαίο ακέραιο αριθμό μεταξύ 10 και 20 (συμπεριλαμβανομένων των 10 και 20). Υπόδειξη: η κλήση Math.random() επιστρέφει έναν double μεταξύ 0 και 1 Εναλλακτικά, οι παρακάτω δηλώσεις επιστρέφουν τελικά έναν ακέραιο n από 0 έως και 99. Random r = new Random(); int n = r.nextint(100); 5. Να τυπώνει τους αριθμούς από το 1 μέχρι το 100 με βήμα 5. 6. Να τυπώνει τους αριθμούς από το 100 μέχρι το 0 (με βήμα 10) εκτός του 20.
Άσκηση #3 Γράψτε ένα Java πρόγραμμα που να παράγει δύο τυχαίους μονοψήφιους ακεραίους number1 και number2 όπου number1 > number2 και εμφανίζει μια ερώτηση σαν Πόσο κάνει 9 2; σε ένα μαθητή Αφού ο μαθητής συμπληρώσει την απάντησή του στο input πλαίσιο διαλόγου, το πρόγραμμα εμφανίζει ένα message dialog box για να δείξει αν η απάντηση ήταν σωστή (αν όχι, θα πρέπει να δοθεί η σωστή απάντηση). Η διαδικασία αυτή θα επαναλαμβάνεται 10 φορές (τεστ 10 ερωτήσεων) στο τέλος θα βαθμολογείται ο μαθητής (π.χ. «άριστα» με πάνω από 8 σωστές απαντήσεις, «πολύ καλά» για 6 8 σωστές απαντήσεις, «καλά» για 4 5 σωστές απαντήσεις, «όχι καλά» για 0 3 σωστές απαντήσεις.