java:exceptions_intro

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
java:exceptions_intro [2015/03/02 08:01]
gthanos [Αντικείμενο της εξαίρεσης(exception object)]
java:exceptions_intro [2016/02/15 10:00]
gthanos [Εξαιρέσεις (Exceptions)]
Line 1: Line 1:
-====== ​Τι είναι η εξαίρεση (Exception)====== +====== ​Εξαιρέσεις (Exceptions) ====== 
-Όπως αναφέρει και το όνομα ​της συγκεκριμένης ενότητας, θα αναφερθούμε σε έναν μηχανισμό ο οποίος διαχειρίζεται γεγονότα ​τα οποία δεν ανήκουν στην κανονική ​εκτέλεση ​του προγράμματος αλλά συμβαίνουν απροσδόκητα. Για να διασφαλίσουμε ​οτι το πρόγραμμά μας θα συνεχίσει την εκτέλεσή του ακόμη και αν συμβεί ένα απροσδόκητο γεγονός,​ χρησιμοποιούμε τον μηχανισμό των **εξαιρέσεων(exceptions)**.+ 
 +Σε αυτή την ενότητα θα αναφερθούμε σε αντικείμενα τα οποία δημιουργούνται κατά την ροή εκτέλεσης ενός προγράμματος, όταν συμβαίνει κάτι αναπάντεχο ή μη διαχειρίσιμο από το πρόγραμμα. Σε αυτές της περιπτώσεις ​παράγεται ένα νέο αντικείμενο που ονομάζεται "​εξαίρεση" (//​exception//​),​ με παράλληλη διακοπή ​της κανονικής ροής ​του προγράμματος. Ο προγραμματιστής καλείται ​να διαχειριστεί μέσα από επιπλέον κώδικα τις ​πιθανές εξαιρέσεις, ​και κατ'​ επέκταση να διαχειριστεί ομαλά τα γεγονότα από τα οποία προέρχονται. 
 + 
 +Για να διασφαλίσουμε ​ότι το πρόγραμμά μας θα συνεχίσει την εκτέλεσή του ακόμη και αν συμβεί ένα απροσδόκητο γεγονός,​ χρησιμοποιούμε τον μηχανισμό ​διαχείρισης ​των **εξαιρέσεων (exceptions)**. Το βασικό πλεονέκτημα που μας προσδίδει η χρήση των εξαιρέσεων είναι το γεγονός ότι μπορούμε να επιλέξουμε σε ποιο σημείο του προγράμματος θα διαχειριστούμε την εξαίρεση που έχει προκύψει.
  
-Το βασικό πλεονέκτημα που μας προσδίδει η χρήση των εξαιρέσεων είναι το γεγονός οτι μπορούμε να επιλέξουμε σε ποιο σημείο ακριβώς θα διαχειριστούμε την εξαίρεση που έχει προκύψει. 
  
 ====== Αντικείμενο της εξαίρεσης (exception object) ====== ====== Αντικείμενο της εξαίρεσης (exception object) ======
-Οτιδήποτε υπάρχει στην γλώσσα Java δεν είναι κάτι διαφορετικό απο αντικείμενο. Έτσι, ακόμη και οι εξαιρέσεις ​που μπορούν ​να προκληθούν, ​παράγουν ​ένα αντικείμενο το οποίο περιέχει όλες τις πληροφορίες που έχουν να κάνουν με το λάθος το οποίο έχει προκύψει όπως ο τύπος του λάθους και την κατάσταση που βρισκόταν το σύστημα όταν έγινε το λάθος αυτό.+ 
 +Κάθε εξαίρεση που μπορεί να προκληθεί παράγει ένα αντικείμενο το οποίο περιέχει όλες τις πληροφορίες που έχουν να κάνουν με το λάθος το οποίο έχει προκύψειόπως ο τύπος του λάθους και την κατάσταση που βρισκόταν το πρόγραμμα όταν έγινε το λάθος αυτό.
  
 Σε αυτό το σημείο ας δούμε ένα πολύ απλό και συχνό λάθος που μπορεί να προκύψει αν δεν το προσέξουμε εμείς ή ο χρήστης. Σε αυτό το σημείο ας δούμε ένα πολύ απλό και συχνό λάθος που μπορεί να προκύψει αν δεν το προσέξουμε εμείς ή ο χρήστης.
Line 35: Line 38:
 Τι θα συμβεί στο παραπάνω πρόγραμμα αν ο 2ος αριθμός που θα δώσει ο χρήστης είναι 0; Επίσης αν ο χρήστης δεν δώσει αριθμό σαν είσοδο αλλά γράμμα;​ Τι θα συμβεί στο παραπάνω πρόγραμμα αν ο 2ος αριθμός που θα δώσει ο χρήστης είναι 0; Επίσης αν ο χρήστης δεν δώσει αριθμό σαν είσοδο αλλά γράμμα;​
  
-Όπως καταλαβαίνουμε,​ θα πρέπει να προβλέψουμε όλες τις περιπτώσεις(ή τουλάχιστον τις πιο βασικές) στις οποίες ο χρήστης είτε απο λάθος είτε επειδή είναι κακόβουλος θα δώσει σαν είσοδο κάτι το οποίο δεν είναι σωστό και θα προκαλέσει πρόβλημα. +Όπως καταλαβαίνουμε,​ θα πρέπει να προβλέψουμε όλες τις περιπτώσεις (ή τουλάχιστον τις πιο βασικές) στις οποίες ο χρήστης είτε από λάθος είτε επειδή είναι κακόβουλος θα δώσει σαν είσοδο κάτι το οποίο δεν είναι σωστό και θα προκαλέσει πρόβλημα. ​Το παραπάνω παράδειγμα είναι ​ένα από τα προβλήματα που μπορούν να δημιουργηθούν ​σε ένα πρόγραμμα ​και θα πρέπει να το καλύψουμε με σκοπό **να μην σταματήσει η εκτέλεση του προγράμματος**.
- +
-Προφανώς το παραπάνω παράδειγμα είναι ​μια μικρή κατηγορία των διαφόρων ​προβλημάτων που μπορούν να δημιουργηθούν και θα πρέπει να καλύψουμε με σκοπό **να μην σταματήσει η εκτέλεση του προγράμματος**.+
  
 Στο παραπάνω παράδειγμα συνεπώς,​ το σύστημα θα παράξει ένα αντικείμενο που θα περιγράφει το είδος του λάθους που συνέβη. Πρέπει εμείς με κάποιον τρόπο: Στο παραπάνω παράδειγμα συνεπώς,​ το σύστημα θα παράξει ένα αντικείμενο που θα περιγράφει το είδος του λάθους που συνέβη. Πρέπει εμείς με κάποιον τρόπο:
   - να λάβουμε αυτό το αντικείμενο   - να λάβουμε αυτό το αντικείμενο
   - να δούμε το λάθος που έχει προκύψει   - να δούμε το λάθος που έχει προκύψει
-  - να αντιμετωπίσουμε το λάθος έτσι ώστε το πρόγραμμά μας να επιστρέψει σε μια σωστή κατάσταση.+  - να αντιμετωπίσουμε το λάθος έτσι ώστε το πρόγραμμά μας να επιστρέψει σε μια ​"σωστή" ​κατάσταση.
  
-====== Try - catch block ====== +ροηγούμενο: [[:​java:​interfaces| Διεπαφές (Interfaces) ]] | Επόμενο: [[:​java:​exceptions_try_catch_block | Διαχείριση Εξαιρέσεων]]|
-Στην προηγούμενη υποενότητα αναφερθήκαμε συνοπτικά στο ​αντικείμενο της εξαίρεσης. Δεν αναφερθήκαμε όμως στον τρόπο με τον οποίο αντιμετωπίζουμε τις εξαιρέσεις και πως τις χειριζόμαστε. ​+
  
-Τονίσαμε οτι η εξαίρεση είναι εκτός της καθορισμένης λειτουργίας του προγράμματος και όταν προκύπτουν δημιουργούν ένα γεγονός(event). Όπως και τα υπόλοιπα γεγονότα που υπάρχουν στην java έτσι και αυτό το γεγονός χρειάζεται έναν χειριστή που θα φροντίσει για τη διαδικασία που θα ακολουθηθεί όταν προκύψει ένα τέτοιο γεγονός. ​ 
- 
-==== Exception Handler ==== 
-Κάθε τμήμα του κώδικα που υπάρχει περίπτωση να πυροδοτήσει μια εξαίρεση θα πρέπει να την εμπερικλείουμε σε ένα try block. Το block αυτό του κώδικα θα περιγράφει τον τρόπο αντιμετώπισης της κάθε πιθανής εξαίρεσης που μπορεί να προκύψει. Ο ορισμός του block είναι ο εξής: 
- 
-<code java> 
-try{ 
-   code with some exception 
-}catch (ExceptionType name) { 
- 
-}catch (ExceptionType name) { 
- 
-} 
-</​code>​ 
- 
-Εντός του try block βάζουμε τον κώδικα που μπορεί να προκύψει μια εξαίρεση. Στο catch block (το οποίο παρατηρούμε οτι μπορεί να είναι πάνω απο ένα) βάζουμε τον κώδικα που θέλουμε να εκτελεστεί όταν θα προκύψει η κάθε εξαίρεση της οποίας ο τύπος περιγράφεται στα ορίσματα του catch block. ​ Όπως τονίσαμε μπορούμε να έχουμε πάνω απο ένα catch block. ​ 
- 
-Ο τρόπος με τον οποίον λειτουργεί είναι ο εξής. Όταν προκύψει ένα αντικείμενο εξαίρεσης,​ θα εκτελέσει το πρώτο μπλοκ το οποίο ταιριάζει με τον τύπο που περιγράφεται στα ορίσματα (στην προκειμένη περίπτωση ExceptionType). Συνεπώς θα συγκρίνει τον τύπο της εξαίρεσης που προέκυψε με όλους τους τύπους ,με τη σειρά έναν προς έναν, που υπάρχουν σαν παράμετροι στα catch blocks, μέχρι να βρεί κάποιο ταίριασμα και να πραγματοποιήσει τον κώδικα που είναι μέσα στο block. 
- 
-Ας δούμε ένα μικρό τμήμα κώδικα που εντοπίζει ένα είδος εξαίρεσης το οποίο συναντήσαμε και παραπάνω:​ 
- 
-<code java TestDivideByZero.java>​ 
-import java.io.*; 
-import java.util.Scanner;​ 
-public class TestDivideByZero { 
-  
-   ​public static void main (String[] args) { 
-      int x, y, result; 
-      ​ 
-      Scanner input = new Scanner(System.in);​ 
- 
-      System.out.print( "Enter first integer: " ); 
-      x = input.nextInt();​ 
- 
-      System.out.print( "Enter second integer: " ); 
-      y = input.nextInt();​ 
-      ​ 
-      try { 
-           ​result = x/y; 
-           ​System.out.printf( "​Product is %d\n", result ); 
-      } catch (ArithmeticException ae) { 
-           ​System.out.println("​ArithmeticException occured!"​);​ 
-           if(y == 0){ 
-              System.out.println("​Division by zero in particular"​);​ 
-           } 
-      } 
-   ​ 
-   } 
-} 
-</​code>​ 
- 
-Όπως βλέπουμε έχουμε το προηγούμενο παράδειγμα,​ εμπλουτισμένο όμως με κάποιον χειριστή(handler) ο οποίος θα αναγνωρίσει οτι υπάρχει κάποια διαίρεση με το 0 και έτσι θα ενημερώσει τον χρήστη. 
- 
-==== Finaly Block ==== 
-Εκτός απο τα catch blocks, μπορούμε να έχουμε ένα finaly block το οποίο θα εκτελεστεί //​**πάντα**//​. Ακόμη και σε περίπτωση που προκύψει μια εξαίρεση ενός τύπου που δεν έχουμε φροντίσει να συμπεριλάβουμε ή δεν προκύψει καμία εξαίρεση,​ το finaly block θα εκτελεστεί. 
- 
-<code java> 
-try { 
- 
-  File file = new File ("​C:/​Users/​Me/​Desktop/​directory/​file.txt"​);​ 
-  PrintWriter printWriter = new PrintWriter (file); 
-  printWriter.println ("​hello"​);​ 
-  printWriter.close (); 
- 
-} catch (IndexOutOfBoundsException e) { 
-    System.err.println("​IndexOutOfBoundsException:​ " + e.getMessage());​ 
-} catch (IOException e) { 
-    System.err.println("​Caught IOException:​ " + e.getMessage());​ 
-}finally { 
-    if (out != null) {  
-        System.out.println("​Closing PrintWriter"​);​ 
-        out.close(); ​ 
-    } else {  
-        System.out.println("​PrintWriter not open"​);​ 
-    }  
- 
- 
-</​code>​ 
- 
-Ένας λόγος που μπορούμε να χρησιμοποιήσουμε το finaly block είναι για να συμπεριλάβουμε κώδικα που θέλουμε να εκτελεστεί σε όλες τις περιπτώσεις,​ όπως για παράδειγμα να κλείσουμε ελεγχόμενα τα αρχεία του προγράμματος. Στο παραπάνω παράδειγμα υπάρχει ολοκληρωμένο ένα μικρό τμήμα κώδικα που ανοίγει ένα αρχείο,​ γράφει κάτι και μετά το κλείνει το αρχείο που άνοιξε. 
-====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ====== 
-Στην προηγούμενη ενότητα δείξαμε πως μπορούμε να χειριστούμε μια εξαίρεση όταν προκύπτει. Υπάρχει ένας μηχανισμός που μας επιτρέπει να μην χειριστούμε την εξαίρεση στο σημείο που προκύπτει αλλά στο σημείο που καλείται η μέθοδος μεσα στην οποία θα προκύψει μια εξαίρεση. 
- 
-Σε προηγούμενο παράδειγμα αναφερθήκαμε στη PrintWriter class και βάλαμε ένα try-catch block για να διαχειριστούμε τη πιθανή δημιουργία μας εξαίρεσης. ​ 
- 
-<code java> 
- 
-public void writeToFile() throws IOException,​IndexOutOfBoundsException{ 
- 
-  File file = new File ("​C:/​Users/​Me/​Desktop/​directory/​file.txt"​);​ 
-  PrintWriter printWriter = new PrintWriter ("​file.txt"​);​ 
-  printWriter.println ("​hello"​);​ 
-  printWriter.close (); 
- 
- 
-} 
- 
-</​code>​ 
- 
-Στον παραπάνω κώδικα βλέπουμε την περίπτωση στην οποία δεν διαχειριζόμαστε την εξαίρεση εντός της μεθόδου writeToFile αλλά αφήνουμε να διαχειριστεί τις εξαιρέσεις που μπορούν να προκύψουν,​ αυτός που θα καλέσει τη μέθοδο writeToFile. Το μόνο που έχουμε να κάνουμε,​ είναι να βάλουμε τη δεσμευμένη λέξη **throws** και δίπλα όλες τις εξαιρέσεις που μπορούν να προκύψουν εντός της μεθόδου και θέλουμε να τις χειριστούμε. 
- 
-====== Πυροδότηση μιας εξαίρεσης ====== 
-Στις προηγούμενες ενότητες είδαμε τον τρόπο με τον οποίο χειριζόμαστε μια εξαίρεση. Μέχρι αυτό το σημείο έχουμε αναφερθεί σε εξαιρέσεις που παρέχονται απο κλάσεις του συστήματος. Πως όμως δημιουργούνται αυτές οι εξαιρέσεις και πως και εμείς μπορούμε να καλέσουμε μια εξαίρεση;​ 
- 
-Οπως τονίσαμε και παραπάνω η εξαίρεση είναι και αυτή ένα αντικείμενο. Για να καλέσουμε ένα αντικείμενο εξαίρεσης το μόνο που έχουμε να κάνουμε είναι να βάλουμε τη δεσμευμένη λέξη **throw** και δίπλα το αντικείμενο της εξαίρεσης που θέλουμε να καλέσουμε. 
- 
-<code java> 
-public Object pop() { 
-    Object obj; 
- 
-    if (size == 0) { 
-        throw new EmptyStackException();​ 
-    } 
- 
-    obj = objectAt(size - 1); 
-    setObjectAt(size - 1, null); 
-    size--; 
-    return obj; 
-} 
-</​code> ​ 
- 
-Στο παραπάνω παράδειγμα έχουμε δημιουργήσει μια μέθοδο η οποία βγάζει ένα αντικείμενο απο μια stack και το επιστρέφει. Θέλουμε σε περίπτωση που δεν υπάρχει κάποιο αντικείμενο στη stack και καλέσουμε pop να πυροδοτηθεί μια εξαίρεση. ​ 
- 
- 
- 
- 
-  
java/exceptions_intro.txt · Last modified: 2019/04/20 05:02 by gthanos