Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2014-2015 1 Διάλεξη 3 Νήματα (Threads) στην Java Συγχρονισμός Εξωτερικές.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2014-2015 1 Διάλεξη 3 Νήματα (Threads) στην Java Συγχρονισμός Εξωτερικές."— Μεταγράφημα παρουσίασης:

1 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Διάλεξη 3 Νήματα (Threads) στην Java Συγχρονισμός Εξωτερικές διεργασίες Collections & Generics Διαχείριση σφαλμάτων στην Java

2 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο  Νήματα (Threads) στην Java  Συγχρονισμός  Εξωτερικές διεργασίες  Collections & Generics  Διαχείριση σφαλμάτων στην Java

3 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Εισαγωγή στα νήματα  Σε υπολογιστικά περιβάλλοντα εφαρμογές «ανταγωνίζονται» να αποκτήσουν την δυνατότητα πρόσβασης και εκτέλεσης στην CPU (concurrent programming).  Δυο ειδών οντότητες εκτέλεσης συναντούμε συνήθως, τις διεργασίες (processes) και τα νήματα (threads).  Διεργασίες Οι διεργασίες αποτελούν αυτόνομες εφαρμογές που διαθέτουν δικό τους memory space. Το εκάστοτε λειτουργικό σύστημα υποστηρίζει την ύπαρξη πόρων για την επικοινωνία μεταξύ διεργασιών (Inter Process Communication-ΙPC resources) στον ίδιο ή και σε διαφορετικούς υπολογιστές (πχ pipes, sockets…).  Νήματα Μπορούν να χαρακτηριστούν και ως lightweight processes. Παρέχουν και αυτά ένα χώρο εκτέλεσης μόνο που η δημιουργία ενός thread απαιτεί λιγότερους πόρους να δεσμευτούν από το λειτουργικό σύστημα. Τα νήματα γεννώνται μέσα σε μια διεργασία. Συγκεκριμένα, μια διεργασία μπορεί να δημιουργήσει ένα ή περισσότερα νήματα ώστε να εκτελέσει πολλά tasks «ταυτόχρονα». Τα νήματα μοιράζονται πόρους της διεργασίας που τα δημιουργεί όπως μνήμη, αρχεία κλπ αλλά διαθέτουν και το δικό τους address space. Η αλλαγή στην προσπέλαση της CPU μεταξύ threads είναι λιγότερο χρονοβόρα (context switching) σε σχέση με τις διεργασίες.

4 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Τα νήματα στην Java (1/2)  H Java μας παρέχει δυο τρόπους για την δημιουργία νημάτων Με το να κάνουμε extend την κλάση Thread (java.lang.Thread) Με το να κάνουμε implement το Runnable interface (java.lang.Runnable)  Extends Thread Μια κλάση μπορεί να κάνει extend την Thread και να κάνει override την μέθοδο run() με σκοπό να ορίσει τα βήματα εκτέλεσης ενός thread. (Να σημειώσουμε πως η Thread κάνει implement το Runnable Interface) O constructor της κλάσης αυτής μπορεί να καλέσει τον constructor της Thread ρητά με χρήση της super(). Η κλάση μας κληρονομεί την μέθοδο start() που ορίζεται στην κλάση Thread και με την κλήση της από ένα αντικείμενο μπορεί να ξεκινήσει την εκτέλεση του ένα νέο thread.

5 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Τα νήματα στην Java (2/2)  Implements Runnable Μια κλάση μπορεί να κάνει implement το interface Runnable αρκεί να γραφτεί κώδικας για την μέθοδο run() που θα οριζει τον κύκλο ζωής ενός thread. Ακολούθως, ένα αντικείμενο τύπου Thread δημιουργείται και του περνάμε σαν όρισμα στον constructor του ένα αντικείμενο από την κλάση που δημιουργήσαμε και κάνει implement το Runnable. Η μέθοδος start() του αντικειμένου τύπου Thread καλείται και επιστρέφει μόλις γεννηθεί το thread 5 Συνίσταται η χρήση threads που κάνουν implement το Runnable interface αντί να κληρωνομούν την Thread Class: 1.Αν κάνoυμε extend την Thread, τότε δεν μπορούμε να κάνουμε extend καμία άλλη κλάση 2.To Runnable interface μας υπαγορεύει να κάνουμε implement μόνο μια μέθοδο (την run) και αποφεύγουμε να κληρονομήσουμε extra overhead της Thread.

6 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Κύκλος ζωής ενός thread Start: είναι η κατάσταση στην οποία δημιουργούμε ένα αντικείμενο τύπου Thread και λίγο πριν καλέσουμε την start() Runnable (Ready-to-run): Είναι η στιγμή που καλείται η start() και από εδώ ξεκινά η ζωή ενός thread. Σε αυτή την κατάσταση περιμένει πρόσβαση στην CPU. Ακόμη, σε αυτή την κατάσταση μπορούμε να μεταπέσουμε από τις non-runnable και running Running: Σε αυτή την κατάσταση το thread εκτελείται. Ο scheduler το επιλέγει μέσα από την runnable pool. Dead: Το thread σε αυτή την κατάσταση παύει να εκτελεί και γίνεται join από την διεργασία που το δημιούργησε. Non-runnable state: Kλήση της static: void sleep(long millisecond) throws InterruptedException Περιμένει notification από άλλο thread: final void wait() throws InterruptedException To thread περιμένει για I/O πόρους Περιμένει τον τερματισμό ενός άλλου thread για να τερματίσει ( joint completion ) Περιμένει μέχρι να κάνει lock κάποιο πόρο.

7 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Διάλεξη 4 Static μέθοδος που τυπώνει το όνομα του thread που την κάλεσαι και το μήνυμα που δέχεται ως παράμετρο Η run ορίζει τον κύκλο ζωής του thread H main εκτός από διεργασία αποτελεί και thread και μπορεί να καλέσει την threadMessage Σε περίπτωση που το thread λάβει interrupt από κάποιο άλλο thread To αντικείμενο t τύπου Thread μας παρέχει μεθόδους για να χειριστούμε το thread που γεννήσαμε

8 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο  Νήματα (Threads) στην Java  Συγχρονισμός  Εξωτερικές διεργασίες  Collections & Generics  Διαχείριση σφαλμάτων στην Java

9 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Συγχρονισμός  Ζητήματα ασυνέπειας δεδομένων προκύπτουν όταν ένα σύνολο από threads διαμοιράζονται κοινή μνήμη και η πρόσβαση σε αυτή δεν γίνεται συγχρονισμένα.  Η Java μας παρέχει την μεθοδολογία για να πετύχουμε συγχρονισμό στην πρόσβαση ενός κοινού πόρου.  Μεγάλη προσοχή πρέπει να δίνουμε όχι μόνο στο να σχεδιάσουμε σωστά την ελεγχόμενη πρόσβαση, αλλά και την αποφυγή καταστάσεων όπως deadlocks και starvation. start() thread1thread2 Shared object

10 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Συγχρονισμός και μέθοδοι Ορίζουμε σαν διαμοιραζόμενο πόρο το αντικείμενο t Δημιουργούμε δυο νήματα που ζητούν πρόσβαση στο αντικείμενο μέσα από τις μεθόδους του. Ορίζουμε ως synchronized τις μεθόδους της κλάσης. Κάθε φορά ένα νήμα θα έχει πρόσβαση σε οποιαδήποτε synchronized μέθοδο ενός δεδομένου αντικειμένου, μπλοκάροντας οποιαδήποτε άλλη κλήση τόσο στην ίδια όσο και στις υπόλοιπες synchronized μεθόδους. Η λειτουργία του synchronized βασίζεται στην ύπαρξη ενός intrinsic lock που διαθέτει το αντικείμενο Το πρόβλημα που μπορεί να προκύψει από αυτή τη σχεδίαση είναι να προκληθούν φαινόμενα starvation, μιας και απαγορεύουμε την πρόσβαση στον διαμοιραζόμενο πόρο για όλη τη διάρκεια της κλήσης μιας synchronized μεθοδου. Το νήμα 2 είναι σε κατάσταση BLOCKED

11 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Συγχρονισμός και block εντολών Στην περίπτωση των synchronized statements πρέπει να δηλώσουμε ως προς ποιό αντικείμενο πάμε να κάνουμε lock. Fine-grained συγχρονισμός. Επικεντρωνόμαστε στον διαμοιραζόμενο πόρο και δεν μπλοκάρουμε την λειτουργία για όλη τη διάρκεια εκτέλεσης της μεθοδου

12 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Συγχρονισμός με χρήση αντικειμένων Διάλεξη 4 Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Ορισμός αντικειμένων με αποκλειστική χρήση για τον συγχρονισμό διαφορετικών πόρων Η πρόσβαση στον ένα πόρο δεν αποκλείει την ταυτόχρονη προσπέλαση του άλλου

13 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Ατομική Εκτέλεση (Atomic execution)  Ατομική πράξη εκτέλεσης (Atomic action) ορίζουμε την πράξη που εκτελείται επιτυχώς και με τη μια. Δεν μπορεί να σταματήσει στη μέση. Είτε εκτελείται ολόκληρη είτε καθόλου.  Ακόμα και απλές πράξεις μπορεί να μην είναι ατομικές λόγω του ότι αποσυντίθενται σε επιμέρους (χωρίς να καταλαβαίνει ο χρήστης). Παράδειγμα: double d; d++;  Retrieve the current value of d.  Increment the retrieved value by 1.  Store the incremented value back in d.  Παρόλα αυτά οι παρακάτω πράξεις είναι ατομικές: Για primitive variables (εκτος long, double) και references, οι πράξεις read/write ειναι ατομικές. Για όλες τις μεταβλητές που ορίζονται ως volatile (πτητικές) (εδώ συμπεριλαμβάνονται οι long, double).  Οι αλλαγές που κάνουμε σε volatile variables είναι αμέσως οράτες σε άλλα νήματα.  Ορίζοντας κάτι volatile δεν σημαίνει ότι εξασφαλίζουμε συγχρονισμό!!!

14 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο  Νήματα (Threads) στην Java  Συγχρονισμός  Εξωτερικές διεργασίες  Collections & Generics  Διαχείριση σφαλμάτων στην Java

15 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Εξωτερικές διεργασίες  Η Java σχεδιάστηκε με σκοπό να παρέχει στις εφαρμογές ανεξαρτησία από το περιβάλλον εκτέλεσης.  Όμως, υπάρχουν περιπτώσεις που θέλουμε να εκτελέσουμε μια εφαρμογή που να σχετίζεται με το λειτουργικό σύστημα που βρισκόμαστε.  Η μεθοδολογία που ακολουθούμε είναι να δημιουργούμε μια νέα διεργασία μέσα στην εφαρμοφή μας που θα εκτελεί platform dependent ενέργειες.  Η κλάση Runtime αποτελεί μια διεπαφή με το περιβάλλον που τρέχει η εφαρμογή μας getRuntime(): μας επιστρέφει ένα αντικείμενο τύπου Runtime για την ίδια μας την εφαρμογή exec(String[] cmdAndΑrgs): δημιουργεί νέα διεργασία που εκτελεί την εντολή με παραμέτρους που της περνάμε σαν όρισμα Process p = Runtime.getRuntime().exec("/bin/ls");  Προσοχή!! Η java ανακατευθύνει τα stdin, stdout, stderr. Για να αλληλεπιδράσουμε με την διεργασία πρέπει να χρησιμοποιήσουμε τις μεθόδους getInputStream(), getOutputStream() και getErrorStream() που μας παρέχει το αντικείμενο τύπου Process.

16 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Παράδειγμα Εκτελούμε την ls που βρίσκεται στον κατάλογο /bin Η getInputStream μας παρέχει πρόσβαση στο output stream της διεργασίας παιδιού. Τα δεδομένα αυτά αποτελούν input stream για την main Κάνουμε buffered το input stream και διαβάζουμε γραμμή-γραμμή τα δεδομένα Κλείνουμε πάντα τις ροές!!

17 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο  Νήματα (Threads) στην Java  Συγχρονισμός  Εξωτερικές διεργασίες  Collections & Generics  Διαχείριση σφαλμάτων στην Java

18 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Collections  Ως Collections ορίζονται αντικείμενα που ομαδοποιούν άλλα αντικείμενα σε μια οντότητα. Τα Collections μας παρέχουν επιπλέον ένα framework για να αποθηκεύσουμε και να διαχειριστούμε τα αντικείμενα αυτά.  Ένα collection framework περιλαμβάνει: Interfaces: διεπαφή για να χειριστούμε/προσπελαύνουμε με τον ίδιο τρόπο collections που διαθέτουν διαφορετικές λεπτομέριες υλοποίησης Κλάσεις: περιλαμβάνουν υλοποιημένες κλάσεις των Interfaces. Συνιστούν βιβλιοθήκη για τις εφαρμογές μας. Αλγορίθμους: αλγόριθμοι όπως η αναζήτηση, ταξινόμηση αντικειμένων υλοποιούνται με διαφορετικό τρόπο ως μέθοδοι των διαφόρων κλάσεων. Οι αλγόριθμοι αυτοί είναι πολυμορφικοί μιας και η ίδια μέθοδος διαφέρει ανάλογα με το collection interface.  Μερικά από τα χαρακτηριστικά και προτερήματα από την χρήση collection framework: Έτοιμος κώδικας για χρήση από τις εφαρμογές μας Data structures εμπλουτισμένα με αλγόριθμους για γρήγορη προσπέλαση Ενιαίο API για χρήση, ανεξάρτητο από τις λεπτομέριες υλοποίησης

19 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Collection interfaces  Διαφορετικά είδη collection interfaces συνιστούν μια ιεραρχία και καθορίζουν διαφορετικούς τύπους αποθήκευσης και χειρισμού αντικειμένων. Collection: είναι η ρίζα στην ιεραρχία των collections και δεν υλοποιείται από κάποια κλάση. Χρησιμοποιείται συνήθως για την επικοινωνία collections με γενικό τρόπο. Set: ορίζει μια συλογή στην οποία δεν μπορούν να υπάρχουν διπλότυπα αντικείμενα. List: συνιστά μια συλλογή από αντικείμενα που εμφανίζουν μια σειρά. Μπορούμε να προσπελάσουμε ένα αντικείμενο με χρήση κάποιου index. Queue: collection που εμφανίζει τις ιδιότητες της ουράς. Map: collection που αντιστοιχεί κάποιο αντικείμενο με ένα κλειδί. SortedSet: διαθέτει τις ίδιες ιδιότητες με το Set, μόνο που χειρίζεται τα αντικείμενα με σειρά. SortedMap: διαθέτει τις ίδιες ιδιότητες με το Map, καθώς επίσης τα κλειδιά είναι ταξινομημένα.

20 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Collection implementation  Η υλοποίηση των Collection interfaces μπορεί να γίνει με διαφορετικούς τρόπους. Οι υπάρχουσες κατηγορίες συνοψίζονται παρακάτω: General-purpose implementations σε αυτή την κατηγορία βρίσκουμε τις πιο συχνά χρησιμοποιούμενες κλάσεις για collections. Special-purpose implementations κλάσεις για ειδικό σκοπό εμφανίζονται στην κατηγορία αυτή που παρουσιάζουν πολλές φορές μη αποδοτική συμπεριφορά. Concurrent implementations η υλοποίηση που παρέχεται εξασφαλίζει την ταυτόχρονη προσπέλαση των αντικειμένων αυτής της κατηγορίας από πολυνηματικά περιβάλλοντα (java.util.concurrent package). Wrapper implementations χρησιμοποιούνται σε συνδυασμό με general-purpose υλοποιήσεις για να παρέχουν επιπλέον λειτουργικότητα. Convenience implementations collections που είναι σχεδιασμένα με static συμπεριφορά (πχ singleton sets). Abstract implementations παρέχουν abstract κλάσεις για custom υλοποίηση από τον χρήστη.  Πιο συχνή είναι η χρήση general-purpose implementations και συγκεκριμένα Set  HashSet, TreeSet, LinkedHashSet List  ArrayList, LinkedList Map  HashMap, TreeMap, LinkedHashMap Κάθε μια από τις κλάσεις παρέχει υλοποίηση όλων των μεθόδων που έχουν συμφωνηθεί στο interface. Δεν είναι thread-safe. Παρέχουν iterators για προσπέλαση στοιχείων. Είναι Serializable και υποστηρίζουν την clone().

21 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Προσπέλαση ενός Collection  Υπάρχουν δυο τρόποι για να προσπελάσει κανείς κάποιο collection αντικείμενο, και κατά συνέπεια τα στοιχεία που το αποτελούν, ανεξάρτητα από τις λεπτομέρειες υλοποίησης: Με χρήση της δομής ελέγχου for-each Με χρήση Iterator.  Η δομή ελέγχου for-each μας επιτρέπει να προσπελάσουμε με συνέπεια το σύνολο των στοιχείων ενός collection (ή ενός πίνακα array). for (Object o : collection) System.out.println(o);  Ο Iterator είναι ένα interface που μας δίνει μεθόδους για να προσπελάσουμε ένα collection καθώς και να διαγράψουμε στοιχεία του. Κάθε Collection υλοποιεί τη μέθοδο Iterator() μας επιστρέφει ένα αντικείμενο τύπου Iterator. public interface Iterator { boolean hasNext(); E next(); void remove(); //optional } static void filter(Collection c) { for (Iterator it = c.iterator(); it.hasNext(); ) if (!cond(it.next())) it.remove(); }

22 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Άλλα χρήσιμα χαρακτηριστικά...  Bulk operations containsAll(): ελέγχουμε αν ένα collection περιέχει όλα τα στοιχεία ενός άλλου. addAll(): «συνενώνει» δυο collections. removeAll(): διώχνει τα στοιχεία από ένα collection που εμφανίζονται σε ένα άλλο (διαφορά συνόλων). retainAll(): η αντίστροφη διαδικασία από το removeAll. Clear(): αδειάζουμε ένα collection από τα στοιχεία του.  size()  Μας επιστρέφει το πλήθος των στοιχείων που διατηρεί το collection  toArray() Μέθοδος που μας επιτρέπει να μετατρέψουμε τα στοιχεία ενός collection σε πίνακα από αντικείμενα Collection c Object[] a = c.toArray(); ή και String[] a = (String[]) c.toArray(new String[c.size()]);

23 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Generics  Χαρακτηριστικό που εμφανίστηκε στην Java SE 5.  Μας παρέχει “type-safety at compile time” και κατά συνέπεια να αποφεύγουμε τον κίνδυνο για “ClassCastException” κατά την εκτέλεση.  Τα generics είναι άμεσα συνδεδεμένα με την χρήση Collections.  Πως δουλεύει ο compiler με την ύπαρξη generics (Type Erasure) Σβήνει τα generics για να μείνουν raw types, για παράδειγμα ArrayList  ArrayList. Εισάγει type casting στα κατάλληλα σημεία μέσα στον κώδικα.  Τα generics μας παρέχουν μια ευχέρεια για το συντακτικό της γλώσσας και δεν κρατούν πληροφορίες για τον τύπο αντικειμένων κατά την διάρκεια της εκτέλεσης. List myIntList = new LinkedList (); myIntList.add(new Integer(0)); Integer x = myIntList.iterator().next(); List myIntList = new LinkedList(); myIntList.add(new Integer(0)); Integer x = (Integer) myIntList.iterator().next();

24 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Η χρήση των Generics μέσα από παραδείγματα Set setOfRawType = new HashSet (); setOfRawType = new HashSet (); Set setOfAnyType = new HashSet (); setOfAnyType.add("abc"); setOfAnyType.add(new Float(3.0f)); Set setOfUnknownType = new LinkedHashSet (); setOfUnknownType = new LinkedHashSet (); Set setOfString = new HashSet (); setOfString = new LinkedHashSet (); Set SetOfObject = new HashSet (); //compiler error

25 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο  Νήματα (Threads) στην Java  Συγχρονισμός  Εξωτερικές διεργασίες  Collections & Generics  Διαχείριση σφαλμάτων στην Java

26 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Σφάλματα στην Java (1/2)  Τα σφάλματα (Bugs) είναι το συνηθέστερο πρόβλημα ενός προγράμματος Προγραμματιστικά λάθη Λάθη σχεδιασμού Λάθος είσοδος δεδομένων Αστοχία υλικού Μη ελεγχόμενοι, εξωγενείς παράγοντες  Κάθε προγραμματιστής πρέπει να διαχειρίζεται τις καταστάσεις: Στην C: Κάθε συνάρτηση γυρνά κάποια τιμή ενώ παράλληλα η perror τυπώνει το σφάλμα που συνέβη. Στην Java: Χρήση εξαιρέσεων (exceptions). Υπάρχουν δύο είδη, οι ελεγχόμενες εξαιρέσεις (checked) και μη ελεγχόμενες (unchecked).

27 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Σφάλματα στην Java (2/2)  Κατά την εκτέλεση ενός προγράμματος όταν συμβεί σφάλμα σε κάποια συνάρτηση που εκτελείται, αυτή δημιουργεί ένα αντικείμενο (exception object) και το παραδίδει στο runtime system (κάνει throw ένα exception).  Ένα exception αντικείμενο περιέχει πληροφορίες για το είδος του σφάλματος που συνέβη, την κατάσταση του προγράμματος μας τη στιγμή του exception κ.α...  To runtime system ψάχνει για κάποιο handler ορισμένο από τον προγραμματιστή που διαχειρίζεται αυτό το σφάλμα (κάνει catch το exception). Η αναζήτηση ξεκινά ιεραρχικά από την τρέχουσα συνάρτηση που συνέβη το σφάλμα και φτάνει μέχρι την main. method3() method2() method1() main() Throws exception Forwards exception Catch exception Call stack trace

28 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Κατηγορίες exceptions  Η Java μας παρέχει τριών ειδών exceptions. Όλα έχουν ως υπερκλάση την java.lang.Throwable  Checked exceptions: Ορίζουν exceptional conditions όπου μια εφαρμογή θα πρέπει να κάνει recover. Υπόκεινται στο “Catch or Specify Requirement”, αφού και το πρόγραμμα μας θα πρέπει να διαθέτει handlers για να τα κάνει catch και να δώσει προς τον χρήστη κάποιο διαγνωστικό μήνυμα. Όλα τα exceptions θεωρούνται checked, εκτός από αυτά που ανήκουν στις κλάσεις Error, RunTimeException και τις αντίστοιχες υποκλάσεις τους  Error: Ορίζουν exceptional conditions που οφείλονται σε εξωτερικούς από την εφαρμογή παράγοντες και η εφαρμογή συνήθως δεν μπορεί να προβλέψει και να κάνει recover. Συνήθως οι λόγοι είναι αστοχία στο hardware. Δεν υπόκεινται στο “Catch or Specify Requirement” και το πιο πιθανό είναι να τυπωθεί το stack trace μέχρι το σημείο που συνέβη το exception και το πρόγραμμα μας να τερματίσει.  Runtime exceptions/Unchecked exceptions: Ορίζουν exceptional conditions που οφείλονται σε λογικά λάθη του προγραμματιστή. Το πιο δημοφιλές exception σε αυτή την κατηγορία είναι το NullPointerException!! Δεν υπόκεινται στο “Catch or Specify Requirement” και ανήκουν στην κλάση RunTimeException

29 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Exception handler  Η Java μας παρέχει τρία exception handler components. Τα try, catch, και finally blocks μας επιτρέπουν να ορίσουμε τον δικό μας exception handler. try { code } catch (ExceptionType name) { System.err.println(.....);.... } catch (ExceptionType name) { System.err.println(.....);.... } finally {..... } Περικλείω μέσα στο try block κομμάτι της εφαρμογής μου που υπάρχει πιθανότητα να γίνει throw ένα exception. Κάθε catch block ορίζει έναν exception handler, για ένα δεδομένο τύπο exception. Συνήθως τυπώνουν διαγνωστικό μήνυμα προς το χρήστη. Το finally block εκτελείται πάντα, είτε συμβεί exception είτε όχι. Συνήθως γράφουμε σ’ αυτό clean up κώδικα. Εάν δεν θέλουμε να διαχειριστούμε κάποιο/α “ExceptionType”, τότε εισάγουμε στο header της εκάστοτε συνάρτησης την δήλωση … throw ExceptionType

30 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Χρήση 2 διαδοχικών exceptions για να καλύψουμε τις περιπτώσεις απώλειας του αρχείου και σφάλματος εγγραφής. Το σφάλμα θα το διαχειριστεί η καλούσα μέθοδος. Η ανώτερη ιεραρχικά κλάση διαχειρίζεται και τα 2 πιθανά σφάλματα. Γιατί θα έχουμε πρόβλημα εδώ;

31 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Διαχειριζόμαστε το exception όπως το ζητά η αντίστοιχη μέθοδος. Σφάλμα στην γραμμή 53! Μπορούσε να μην εμφανιστεί αν δεν ζητούσαμε εκτύπωση. Σφάλμα στην γραμμή 58! Προέρχεται από λάθος κλήση στην γραμμή 38. Η χρήση του stack trace που μας δίνει κάθε exception επιτρέπει την αποσφαλμάτωση του προγράμματός μας. Η διαδικασία είναι η εξής: 1.Αναζητούμε την πρώτη δική μας κλήση που δημιούργησε πρόβλημα (από πάνω προς τα κάτω). 2.Ανατρέχουμε στην αντίστοιχη γραμμή του κώδικά μας. Το σημείο αυτό έχει πρόβλημα. 3.Ανάλογα με το πρόβλημα ελέγχουμε την είσοδο ή την έξοδο της εντολής.

32 Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Αποσφαλμάτωση με χρήση Exceptions - Πλεονεκτήματα  Η κλάση exceptions προσφέρει την δυνατότητα εκτύπωσης των κλήσεων που οδήγησαν στο συγκεκριμένο σφάλμα Μέθοδος printStackTrace(); Τυπώνονται οι διαδοχικές κλήσεις μεθόδων που οδήγησαν στο συγκεκριμένο σφάλμα.  ΔΕΝ ΕΙΝΑΙ ΚΑΛΗ ΠΡΑΚΤΙΚΗ: Να χρησιμοποιείται η ανώτερη ιεραρχικά κλάση για την διαχείριση όλων των σφαλμάτων (δηλαδή η Exception). Να τοποθετείται throws στην μέθοδο main.  Μερικά από τα προτερήματα που μας παρέχει η χρήση exceptions: Διαχωρισμός του κώδικα που κάνει exception handling από τον κώδικα της εφαρμογής μας. Διαχείρηση ενός exception υψηλότερα στο call stack, απλά με την χρήση της δήλωσης throws. Κατηγοριοποίηση και χειρισμός των exceptions σε ομάδες λόγω της ύπαρξης ιεραρχίας κλάσεων (πχ τα exceptions FileNotFoundException και InterruptedIOException μπορούν να αντικατασταθούν από το IOException)


Κατέβασμα ppt "Διάλεξη 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2014-2015 1 Διάλεξη 3 Νήματα (Threads) στην Java Συγχρονισμός Εξωτερικές."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google