Συντακτικά λάθη, λάθη εκτέλεσης, Λογικά λάθη

Σχετικά έγγραφα
6. Εξαιρέσεις στη γλώσσα Java

Αντικειμενοστρεφής Προγραμματισμός

Εξαιρέσεις (Exceptions) Λάθη (Errors) Χειρισμός των Εξαιρέσεων (Exception Handling) Assertions

Χειρισµός Σφαλµάτων. Γρηγόρης Τσουµάκας. Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης. Έκδοση:

ΕΙΣΟ ΟΣ-ΕΞΟ ΟΣ Ε ΟΜΕΝΩΝ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εξαιρέσεις

ΕΞΑΙΡΕΣΕΙΣ. Εξαιρέσεις προκαλούνται. από το σύστηµα. από το πρόγραµµα

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

ΕΙΣΟ ΟΣ-ΕΞΟ ΟΣ Ε ΟΜΕΝΩΝ

Προγραμματισμός ΙΙ (Java) 4. Διαχείριση εξαιρέσεων

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 12: Ροές και είσοδος/έξοδος αρχείων

Οντοκεντρικός Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΕΞΑΙΡΕΣΕΙΣ ΚΑΙ Ο ΧΕΙΡΙΣΜΟΣ ΤΟΥΣ

Αρχεία και Ρεύματα. Αρχεία

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Είσοδος Έξοδος (Input Output) Εξαιρέσεις (Exceptions)

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 10: Exceptions handling (Χειρισμός εξαιρέσεων)

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

Γενικά (για τις γραπτές εξετάσεις)

Εισαγωγή στον Προγραμματισμό

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιαχείριση Εξαιρέσεων. Εισαγωγή στη ιαχείριση Εξαιρέσεων

Διαδικτυακές Εφαρμογές Ενότητα 4: Streams

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

10.1 Γενικά για τα streams

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Ειδικά Θέματα Προγραμματισμού

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αρχεία

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #16

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εξαιρέσεις Αρχεία String processing

Εξαιρέσεις στην Java EXCEPTIONS IN JAVA

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

Αντικειμενοστρεφής Προγραμματισμός

Εισαγωγή στον Προγ/μό Η/Υ

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Αντικειµενοστρεφής Προγραµµατισµός

2.1. Εντολές Σχόλια Τύποι Δεδομένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

Εξαιρέσεις (στη Java)

14. Δικτύωση με Java Δικτύωση με Java Sockets Δημιουργία της σύνδεσης Διευθυνσιοδότηση της σύνδεσης

Χειρισμός Εξαιρέσεων EXCEPTIONS IN JAVA

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εξαιρέσεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Εξαιρέσεις. try, catch, finally, throw, throws

NATIONAL & KAPODISTRIAN UNIVERSITY OF ATHENS. Διαχείριση Δικτύων. Nikolas Bompetsis

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Εξαιρέσεις στη Java. Περιεχόμενα. Κάποιες προκαθορισμένες ρ εξαιρέσεις. Κωστής Σαγώνας

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 29/11/07

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Στοιχεία εξεταζόµενου Αριθµός Απάντησης Βαθµολογία. Σύνολο (Θέµα 4 ο )

Week 9: Input / Output

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Βασικά της γλώσσας JAVA

2 ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Κλάσεις και Αντικείµενα

Αντικειμενοστραφής Προγραμματισμός

ΑΝΑΚΕΦΑΛΑΙΩΣΗ. Τα βασικά για την γλώσσα Java

Είσοδος & Έξοδος. Γρηγόρης Τσουµάκας. Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης. Έκδοση:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07

Βασίλης Χριστοφίδης Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 21 Σεπτεµβρίου 2012

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Προγραµµατισµός ΙΙ Java 2

ιαδικτυακές Εφαρµογές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

Εισαγωγή στον αντικειμενοστραφή προγραμματισμό με τη Java

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 2: Βασικές εντολές

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων

Διάλεξη 15: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

Java Μέρος Ι Αντικειμενοστρεφής Προγραμματισμός - 7

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Transcript:

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Διάλεξη #7 η : Εξαιρέσεις (λάθη εκτέλεσης, χειρισμός εξαιρέσεων λαθών,) Είσοδος / Έξοδος (ρεύματα, κλάσεις εισόδου και εξόδου, διαχείριση αρχείων) Γαβαλάς Δαμιανός dgavalas@aegean.gr Συντακτικά λάθη, λάθη εκτέλεσης, Λογικά λάθη Έχετε μέχρι στιγμής μάθει για τρεις τύπους λαθών: Συντακτικά λάθη (syntax errors) Προκύπτουν όταν δεν ακολουθούνται οι (συντακτικοί) κανόνες της γλώσσας Τα ανιχνεύει ο μεταγλωττιστής (compiler) Λάθη εκτέλεσης (runtime errors) Προκύπτουν κατά τη διάρκεια της εκτέλεσης του προγράμματος, εφόσον το περιβάλλον ανιχνεύσει μια λειτουργία/εντολή που αδυνατεί να εκτελέσει Το πρόγραμμα κρεμάει («κρασάρει») Λογικά λάθη (logic errors) Προκύπτουν όταν το πρόγραμμα δεν λειτουργεί με τον επιθυμητό τρόπο 1

Λάθη εκτέλεσης 1 import java.util.scanner; 2 3 public class ExceptionDemo { 4 5 6 7 8 9 10 11 Αν συμβεί μια εξαίρεση σε αυτή τη γραμμή (π.χ. ο χρήστης δε δώσει έν αν ακέραιο αλλά δεκαδικό αριθμό), οι υπόλοιπες γραμμές της μεθόδου δε θα εκτελεστούν και το 12 πρόγραμμα θα τερματίσει 13 Τερματισμός public static void main(string[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter an integer: "); int number = scanner.nextint(); // Display the result System.out.println( "The number entered is " + number); Πως αντιμετωπίζονται τα λάθη εκτέλεσης 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Αν συμβεί μια εξαίρεση σε αυτή τη γραμμή, οι υπόλοιπες γραμμές στην ενότητα try δε θα εκτελεστούν και η εκτέλεση μεταφέρεται στην ενότητα catc h. import java.util.*; public class HandleExceptionDemo { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); boolean continueinput = true; do { try { System.out.print("Enter an integer: "); int number = scanner.nextint(); // Display the result System.out.println( "The number entered is " + number); continueinput = false; catch (InputMismatchException ex) { System.out.println("Try again. (" + "Incorrect input: an integer is required)"); scanner.nextline(); // discard input while (continueinput); 2

Κλάσεις εξαιρέσεων (exception classes) ClassNotFoundException IOException ArithmeticException Exception AWTException Nu llpoin terexception Run timeexception Ind exoutofboundsexception Object Throwable Πολλές ακόμα κλάσεις IllegalArgumentException LinkageError Πολλές ακόμα κλάσεις VirtualMachineError Error AWTError Πολλές ακόμα κλάσεις Κλάσεις εξαιρέσεων: Η κλάση Throwable 3

Κλάσεις εξαιρέσεων: Λάθη (Errors), Εξαιρέσεις (Exceptions) και Εξαιρέσεις Εκτέλεσης (RuntimeExceptions) Κλάσεις εξαιρέσεων: Λάθη συστήματος (System Errors), Εξαιρέσεις (Exceptions) και Εξαιρέσεις Εκτέλεσης (Runtime Exceptions) Λάθη συστήματος «πετάγονται» από τη JVM και αναπαρίστανται από την κλάση Error, η οποία εσωτερικά λάθη συστήματος. Τέτοια λάθη συμβαίνουν σπάνια, όταν συμβούν δεν μπορείς να κάνει πολλά παρά να ενημερώσεις το χρήστη και να τερματίσεις το πρόγραμμα. Η κλάση Exception περιγράφει λάθη που προκαλούνται από το πρόγραμμα και εξωτερικές περιστάσεις. Τα προγράμματα μπορούν να «συλλάβουν» και να χειριστούν τέτοια λάθη. Ένα RuntimeException προκαλείται από προγραμματιστικά λάθη, όπως κακές μετατροπές (casting), πρόσβαση σε στοιχεία πινάκων που δεν υφίστανται (out of bounds array), αριθμητικά λάθη 4

Ελεγμένες και μη ελεγμένες εξαιρέσεις (checked & unchecked) Οι RuntimeException, Error και οι υποκλάσεις τους είναι γνωστές ως μη ελεγμένες εξαιρέσεις Αφορούν συνήθως σε προγραμματιστικά λογικά λάθη από τα οποία μπορείς να επανακάμψεις, π.χ. μία NullPointerException «πετάγεται» αν προσπαθήσεις να προσπελάσεις ένα αντικείμενο μέσω μιας μεταβλητής αναφοράς πριν πραγματικά καταχωρηθεί ένα αντικείμενο (τιμή) σε αυτή, ενώ ένα IndexOutOfBoundsException «πετάγεται» αν προσπελάσεις ένα στοιχείο ενός array εκτός των ορίων του. Για να αποφευχθεί υπερχρήση από ενότητες try catch, η Java δεν υποχρεώνει να αντιμετωπίσεις όλες τις πιθανές μη ελεγμένες εξαιρέσεις. Ελεγμένες και μη ελεγμένες εξαιρέσεις (checked & unchecked) Όλες οι υπόλοιπες είναι γνωστές ως ελεγμένες, δηλαδή ο μεταγλωττιστής αναγκάζει τον προγραμματιστή να τις ελέγξει και να τις αντιμετωπίσει Παραδείγματα ελεγμένων εξαιρέσεων: Ένα πρόγραμμα που προσπαθεί να ανοίξει ένα αρχείο (που δηλώνεται από το χρήστη) το οποίο δεν υπάρχει Ο χρήστης πληκτρολογεί μια URL που δεν υφίσταται Και τα δύο παραπάνω παραδείγματα θα μπορούσαν να συμβούν από ένα λάθος πληκτρολόγησης Εφόσον αυτά τα λάθη μπορούν να συμβούν ως αποτέλεσμα λάθους, η Java υποχρεώνει τον προγραμματιστή να τα χειριστεί 5

Ενότητες try catch Για να αντιμετωπίσουμε μια συγκεκριμένη εξαίρεση κλείνουμε το τμήμα του κώδικα που ενδέχεται να πετάξει την εξαίρεση σε μια ενότητα try Για να συλλάβουμε και να αντιδράσουμε στην εξαίρεση, εφόσον προκύψει, κλείνουμε κάποιο κώδικα σε μια ενότητα catch try { // κώδικας που ενδέχεται να προκαλέσει εξαίρεση catch (ExceptionType e) { // κώδικας που εκτελείται εφόσον προκύψει η εξαίρεση τύπου ExceptionType Παράδειγμα exception public class TestException { public static void main (String args[]) { int i=0; String greetings[] = { one, two, three ; while (i<4) { System.out.println (greetings[i]); i++; System.out.println( Μετά t tl ά το βρόγχο ); one two three Αποτέλεσμα της εκτέλεσης Exception in thread "main" java.lang.arrayindexoutofboundsexception: 3 at TestException.main(TestException.java:6) 6

Παράδειγμα exception public class TestException { public static void main (String args[]) { int i=0; String greetings[] = {"one", "two", "three"; while (i<4) { try { System.out.println (greetings[i]); catch (ArrayIndexOutOfBoundsException e) { System.out.println ("Έπιασα μια εξαίρεση!!"); Αποτέλεσμα i++; της one εκτέλεσης two System.out.println ("Μετά το βρόγχο..."); three Έπιασα μια εξαίρεση!! Μετά το βρόγχο... Παράδειγμα exception Το πρόγραμμα του προηγούμενου παραδείγματος δεν τερματίστηκε λόγω λάθους Η εξαίρεση είχε προβλεφθεί ως ενδεχόμενο και όταν προέκυψε το πρόγραμμα τη χειρίστηκε εκτελώντας τις εντολές της ενότητας catch (τυπώθηκε το «Έπιασα μια εξαίρεση!!» Βέβαια, σε μια τέτοια περίπτωση που προκύπτει από ένα λογικό λάθος, καταλληλότερη λό αντιμετώπιση θα ήταν (αφότου ελέγχαμε την εκτέλεση του κώδικα και βλέπαμε ότι πετάγεται η εξαίρεση) απλώς να αλλάξουμε τον αριθμό επαναλήψεων (while (i<3)) 7

Η λέξη κλειδί finally Η finally ορίζει μια ενότητα εντολών που εκτελείται πάντα, είτε έχει συλληφθεί μια εξαίρεση είτε όχι Η μόνη περίπτωση να μην εκτελεστεί είναι να έχει κληθεί πριν η μέθοδος System.exit(), η οποία προκαλεί τον τερματισμό του προγράμματος try { // κώδικας που ενδέχεται να προκαλέσει εξαίρεση catch (ExceptionType e) { // κώδικας που εκτελείται εφόσον προκύψει η εξαίρεση τύπου ExceptionType finally { // αυτός ο κώδικας θα εκτελεστεί έτσι κι αλλιώς Συνήθεις εξαιρέσεις ArithmeticException Τυπικά το αποτέλεσμα διαίρεσης με το μηδέν για ακεραίους π.χ. int i = 12/0; NullPointerException Γίνεται μια προσπάθεια να προσπελαστεί ένα αντικείμενο ή μέθοδός του πριν ακόμα δημιουργηθεί ένα στιγμιότυπό του π.χ. Circle circles[] = new Circle[3]; System.out.println(circles[0].getRadius()); Στο προηγούμενο παράδειγμα, παρότι δεσμεύθηκε χώρος για ένα πίνακα που έχει 3 αντικείμενα της κλάσης Circle, δεν έχει ακόμα δημιουργηθεί το στιγμιότυπο που θα αποτελέσει το πρώτο στοιχείο του array 8

Συνήθεις εξαιρέσεις NegativeArraySizeException Γίνεται προσπάθεια να δημιουργηθεί ένας πίνακας με αρνητικό ρη πλήθος στοιχείων ArrayIndexOutOfBoundsException Γίνεται προσπάθεια να προσπελαστεί ένα στοιχείο ενός πίνακα πέρα από το πραγματικό πλήθος στοιχείων που έχει οριστεί για τον πίνακα SecurityException Συνήθως εμφανίζεται σε ένα browser όταν η κλάση SecurityManager πετάει μια εξαίρεση για κάποιο applet που προσπαθεί: Να προσπελάσει ένα τοπικό αρχείο Να ανοίξει σύνδεση (socket) με κάποιο απομακρυσμένο Η/Υ Να εκτελέσει ένα άλλο πρόγραμμα στο περιβάλλον εκτέλεσης Πότε να χρησιμοποιείτε Exceptions Πότε πρέπει να χρησιμοποιείτε τις try catch ενότητες στον κώδικα; Πρέπει να τον χρησιμοποιείτε μη αναμενόμενες συνθήκες λάθους, όχι για να αντιμετωπίσετε απλές, αναμενόμενες καταστάσεις, π.χ. o ακόλουθος κώδικας: try { System.out.println(var.toString()); catch (NullPointerException ex) { System.out.println("var is null"); 9

Πότε να χρησιμοποιείτε Exceptions είναι καλύτερο να αντικατασταθεί από τον παρακάτω: if (var!= null) System.out.println(var.toString()); else System.out.println("var is null"); Ορίζοντας εξαιρέσεις (Declaring Exceptions) Κάθε μέθοδος πρέπει να ορίζει τους τύπους των ελεγμένων εξαιρέσεων που μπορεί να «πετάξει» Αυτό είναι γνωστό ως ορισμός εξαιρέσεων, π.χ.: public void mymethod() throws IOException public void mymethod() throws IOException, OtherException 10

«Πέταγμα» ή «ρίξιμο» εξαιρέσεων Όταν ένα πρόγραμμα εντοπίζει ένα λάθος, μπορεί να δημιουργήσει και να «πετάξει»/«ρίξει» ένα κατάλληλο τύπου εξαίρεσης, π.χ.: : throw new TheException(); /** Ορίζει μια νέα ακτίνα */ public void setradius(double newradius) throws IllegalArgumentException { if (newradius >= 0) radius = newradius; else throw new IllegalArgumentException( "Radius cannot be negative"); Όλα μαζί: ορίζοντας, πετάγοντας και συλλαμβάνοντας εξαιρέσεις Η Java θα μας αναγκάσει να αντιμετωπίσουμε την εξαίρεση που ενδέχεται να πετάξει μία μέθοδος μόνο αν πρόκειται για ελεγμένη εξαίρεση Η χρήση try catch είναι υποχρεωτική εδώ μόνο αν η Exception είναι τύπου ελεγμένης (checked) εξαίρεσης, διαφορετικά είναι προαιρετική catch exception method1() { try { invoke method2; catch (Exception ex) { Process exception; method2() throws Exception { if (an error occurs) { throw new Exception(); declare exception throw exception 11

Ρεύματα (streams) Κλάσεις εισόδου και εξόδου Διαχείριση αρχείων Εισαγωγικές παρατηρήσεις Είσοδος (input): Η εισαγωγή δεδομένων από τον εξωτερικό κόσμο κατά την εκτέλεση ενός προγράμματος. Έξοδος (output): Η αντίστροφη διαδικασία με την οποία τα αποτελέσματα ενός προγράμματος γίνονται γνωστά στον εξωτερικό κόσμο. Είσοδος / Έξοδος (Input/Output Ι/Ο) στη Java: Υποστηρίζεται ένας μεγάλος αριθμός κλάσεων για την υλοποίηση λειτουργιών Ι/Ο Βρίσκονται στο πακέτο java.io Αποτελούν υποκλάσεις των βασικών κλάσεων InputStream και OutputStream. 12

Ρεύματα (streams) Στη Java όλες οι θεμελιώδεις λειτουργίες Ι/Ο βασίζονται στη χρήση ρευμάτων (streams) Ένα ρεύμα: Αντιπροσωπεύει μια ροή δεδομένων ή ένα κανάλι επικοινωνίας Έχει ένα συγγραφέα στο ένα του άκρο και έναν αναγνώστη στο άλλο Στη Java τα ρεύματα αποτελούν δρόμους μιας κατεύθυνσης Οι κλάσεις InputStream και OutputStream: Είναι αφηρημένες ορίζουν το κατώτατο επίπεδο διεπαφής για όλα τα ρεύματα Περιέχουν μεθόδους για την ανάγνωση και εγγραφή αντίστοιχα μιας ροής μη δομημένων δεδομένων, σε επίπεδο bytes Υλοποιούνται υποκλάσεις αυτών των κλάσεων για την ανάγνωση και εγγραφή αρχείων, την επικοινωνία μέσω θυρίδων, κ.λπ. Ρεύματα (streams) Οι κλάσεις InputStream και OutputStream αντιπροσωπεύουν τα άκρα ενός απλού ρεύματος. Για αμφίδρομες μ επικοινωνίες χρειάζονται και οι δύο τύποι ρευμάτων. 13

Κλάσεις Εισόδου και Εξόδου InputStream, OutputStream: Αφηρημένες κλάσεις που ορίζουν μεθόδους για την ανάγνωση και την εγγραφή δεδομένων με τη μορφή μη δομημένων ακολουθιών από bytes Όλοι οι υπόλοιποι τύποι ρευμάτων προέρχονται από τις δύο αυτές βασικές κλάσεις DataInputStream, DataOutputStream: Εξειδικευμένα φίλτρα ρευμάτων που επιτρέπουν την ανάγνωση και εγγραφή απλών τύπων δεδομένων, όπως στοιχειώδη αριθμητικά δεδομένα και αντικείμενα τύπου String BufferedInputStream, BufferedOutputStream: Εξειδικευμένα φίλτρα ρευμάτων που ενσωματώνουν τη λειτουργία της προσωρινής αποθήκευσης δεδομένων για επίτευξη μεγαλύτερης αποδοτικότητας Κλάσεις Εισόδου και Εξόδου PrintStream: Εξειδικευμένο φίλτρο που βοηθά στην εκτύπωση κειμένου PipedInputStream, PipedOutputStream: tst Είναι ρεύματα διπλού άκρου και εμφανίζονται πάντα σε ζεύγη. Τα δεδομένα που γράφονται σε ένα ρεύμα τύπου PipedOutputStream διαβάζονται από το αντίστοιχο PipedInputStream FileInputStream, FileOutputStream: Είναι υλοποιήσεις των ρευμάτων InputStream και OutputStream με τις οποίες γίνεται η ανάγνωση και εγγραφή τοπικών αρχείων 14

Απλή Είσοδος / Έξοδος Αντικείμενο System.in: Υλοποιεί την κοινή είσοδος (standard input) μιας εφαρμογής Java. Προέρχεται ρχ από υποκλάση της InputStream. Διαβάζει δεδομένα από το περιβάλλον εκτέλεσης του προγράμματος συνήθως από κάποιο τερματικό ή παράθυρο. Μέθοδος read της InputStream: Επιτρέπει την ανάγνωση ενός byte κάθε φορά από την κοινή είσοδο. Παρέχει ένα byte πληροφορίας και επιστρέφει έναν ακέραιο αριθμό. Μια τιμή επιστροφής ίση με 1 δηλώνει ότι ο τερματισμός του ρεύματος έγινε κανονικά. Αν προκύψει κάποιο λάθος κατά τη διάρκεια της ανάγνωσης, δημιουργείται μια εξαίρεση τύπου IOException. Όλες οι βασικές εντολές I/O μπορεί να προκαλέσουν IOException > απαιτείται η ανίχνευση και ο κατάλληλος χειρισμός τους. Απλή Είσοδος / Έξοδος: Παράδειγμα Ανάγνωση μιας ακολουθίας μέχρι 256 bytes από την κοινή είσοδο (ο χρήστης πληκτρολογεί στο command prompt) try { byte [] data = new byte[256]; /* Διαβάζει δεδομένα που δίνει ο χρήστης και επιστρέφει τον αριθμό των bytes (χαρακτήρων) που δόθηκαν */ int bytesread = System.in.read(data); if (bytesread < 256) System.out.println( Not enough bytes to read! ); else // Εντολές για επεξεργασία δεδομένων catch (IOException e) { System.out.println( Something went wrong! ); 15

Απλή Είσοδος / Έξοδος Αντικείμενο System.out: Υλοποιεί την κοινή έξοδο (standard output). Αντικείμενο System.err: err: Υλοποιεί την έξοδο σφαλμάτων (standard error output). Τα δύο αυτά αντικείμενα: Προέρχονται από κάποια υποκλάση της PrintStream που κληρονομεί την OutputStream. Εκτυπώνουν συνήθως σε κάποιο τερματικό ή παράθυρο. ρ Ρεύματα Δεδομένων Κλάσεις DataInputStream και DataOutputStream: Υλοποιούν φιλτραρισμένα ρεύματα Επιτρέπουν την ανάγνωση ή εγγραφή συμβολοσειρών και στοιχειωδών τύπων δεδομένων που αποτελούνται από περισσότερα του ενός bytes Tα αντίστοιχα ρεύματα ονομάζονται ρεύματα δεδομένων (data streams) και μπορούν να χρησιμοποιηθούν ως φίλτρα πάνω σε κάθε τύπου ρεύματα Υλοποιούν τις διεπαφές DataInput και DataOutput. Παράδειγμα: DataInputStream s = new DataInputStream(System.in); String line = s.readline(); To DataInputStream περιβάλλει το ρεύμα κοινής εισόδου και το χρησιμοποιεί για την ανάγνωση μιας γραμμής κειμένου Η μέθοδος readline διαβάζει bytes μέχρι το τέλος της γραμμής 16

Ρεύματα Δεδομένων Μέθοδος readint: Χρησιμοποιείται για την ανάγνωση ακέραιων τιμών. int i = s.readint(); Διαβάζει 4 bytes από το ρεύμα και τα μετατρέπει σε έναν ακέραιο 32 bit Κλάση DataOutputStream: Παρέχει μεθόδους εγγραφής που αντιστοιχούν στις μεθόδους ανάγνωσης της DataInputStream. Παράδειγμα: H μέθοδος writeint γράφει έναν ακέραιο σε δυαδική μορφή στο ρεύμα εξόδου του εσωτερικού στρώματος Παράδειγμα Ι Ανάγνωση ενός πίνακα από bytes από το πληκτρολόγιο: import java.io.*; class ReadBytes { public static void main(string args[]) throws IOException { byte data [] = new byte[10]; System.out.println( Πληκτρολόγησε μερικούς χαρακτήρες: ); System.in.read(data); y ( ) System.out.print( Πληκτρολόγησες: ); // Θα τυπωθούν μέχρι 10 χαρακτήρες (τόσους χωράει το array) for (int i=0; i<data.length; i++) System.out.print((char) data[i]); 17

Παράδειγμα ΙΙ Υπολογισμός του μέσου όρου μιας λίστας αριθμών που δίνονται από το χρήστη: public static void main(string i args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str; int n; double sum = 0.0; 0; double avg, t; System.out.print("Πόσους αριθμούς θέλεις να δώσεις; "); str = br.readline(); Παράδειγμα ΙΙ (συνέχεια) try { n = Integer.parseInt(str); catch(numberformatexception exc) { System.out.println("Λάθος είσοδος"); n = 0; System.out.println("Δώσε " + n + " τιμές."); for (int i=0; i<n; i++) { System.out.print(": "); str = br.readline(); 18

Παράδειγμα ΙΙ (συνέχεια) try { t = Double.parseDouble(str); catch(numberformatexception exc) { System.out.println("Λάθος είσοδος"); t = 0.0; sum += t; avg = sum / n; System.out.println("Μέσος όρος: " + avg); Διαχείριση Αρχείων Οι εφαρμογές Java μπορούν να διαβάσουν και να γράψουν αρχεία: Τα αρχεία βρίσκονται στο τοπικό σύστημα αρχείων Χρησιμοποιούνται τα προνομία του χρήστη που εκτελεί τις εφαρμογές Γίνεται χρήση της κλάσης File Για τη διαχείριση ενός αρχείου του τοπικού συστήματος αρχείων: Αρχικά ορίζεται ένα αντικείμενο τύπου File Σημαντικοί κατασκευαστές (constructors): File f1 = new File( /one/path/file.txt ); Καθορίζει το πλήρες όνομα ενός αρχείου File f2 = new File( /one/path, file.txt ); Καθορίζει το όνομα του αρχείου και το ευρετήριο στο οποίο βρίσκεται Το αντικείμενο τύπου File δημιουργείται ακόμα και αν τα αρχεία που καθορίζονται δεν υπάρχουν Μετά τη δημιουργία, χρήση των μεθόδων της κλάσης File 19

Μέθοδοι της Κλάσης File Ρεύματα Αρχείων Κλάσεις FileInputStream και FileOutputStream: Είναι δύο εξειδικευμένα ρεύματα για την ανάγνωση και την εγγραφή αρχείων Παρέχουν τη βασική λειτουργικότητα των InputStream και OutputStream προσαρμοσμένη στην ανάγνωση και την εγγραφή δεδομένων που περιέχονται σε αρχεία Ρεύμα FileInputStream: Μπορεί να δημιουργηθεί με βάση μια συμβολοσειρά που περιγράφει το όνομα του αρχείου ή ένα αντικείμενο File: FileInputStream s1 = new FileInputStream( dir/file ); File f = new File( tmp/foo.txt ); FileInputStream s2 = new FileInputStream(f); Μετά τη δημιουργία η Java επιχειρεί να ανοίξει το συγκεκριμένο αρχείο 20

Ρεύματα Αρχείων Ρεύμα FileInputStream (συνέχεια): Αν το αρχείο δεν υπάρχει, προκαλείται μια εξαίρεση τύπου FileNotFoundException Σε περίπτωση που προκληθεί κάποιο άλλο λάθος Ι/Ο η εξαίρεση είναι τύπου IOException Ο κώδικας της εφαρμογής πρέπει να ανιχνεύει και να χειρίζεται τις εξαιρέσεις αυτές Όταν ένα ρεύμα δημιουργείται για πρώτη φορά, η μέθοδος available και η μέθοδος length του αντικειμένου File επιστρέφουν την ίδια τιμή Επιβάλλεται η κλήση της μεθόδου close μετά το πέρας των εργασιών που αφορούν το αρχείο Ρεύματα Αρχείων: Παράδειγμα File f = new File( message.txt ); FileOutputStream s = new FileOutputStream(f); PrintStream p = new PrintStream(s); try { p.println( Hello World ); p.close(); catch() {/* ignore */ Κατασκευάζει ένα νέο αρχείο με όνομα message.txt και γράφει μέσα σε αυτό τη φράση Hello World. Για την εκτύπωση χρησιμοποιεί ένα φίλτρο τύπου PrintStream Όλες οι εξαιρέσεις που μπορούν να προκύψουν ως ενδείξεις σφαλμάτων αγνοούνται 21