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/03 06:06]
gthanos [Αντικείμενο της εξαίρεσης (exception object)]
java:exceptions_intro [2015/03/03 07:09]
gthanos [Exception Handler]
Line 45: Line 45:
  
 ====== Try - catch block ====== ====== Try - catch block ======
-Στην προηγούμενη υποενότητα αναφερθήκαμε συνοπτικά στο αντικείμενο της εξαίρεσης. ​Δεν αναφερθήκαμε ​όμως στον τρόπο με τον οποίο ​αντιμετωπίζουμε τις εξαιρέσεις και πως τις ​χειριζόμαστε.  +Στην προηγούμενη υποενότητα αναφερθήκαμε συνοπτικά στο αντικείμενο της εξαίρεσης. ​Εδώ ​θα δόυμε τον τρόπο με τον οποίο ​διαχειριζόμαστε τις εξαιρέσεις. ​
- +
-Τονίσαμε οτι η εξαίρεση είναι εκτός της καθορισμένης λειτουργίας του προγράμματος και όταν προκύπτουν δημιουργούν ένα γεγονός(event). Όπως και τα υπόλοιπα γεγονότα που υπάρχουν ​στην java έτσι και αυτό το γεγονός χρειάζεται έναν χειριστή που θα φροντίσει για τη διαδικασία που θα ακολουθηθεί όταν προκύψει ένα τέτοιο γεγονός.  +
 ==== Exception Handler ==== ==== Exception Handler ====
 Κάθε τμήμα του κώδικα που υπάρχει περίπτωση να πυροδοτήσει μια εξαίρεση θα πρέπει να την εμπερικλείουμε σε ένα try block. Το block αυτό του κώδικα θα περιγράφει τον τρόπο αντιμετώπισης της κάθε πιθανής εξαίρεσης που μπορεί να προκύψει. Ο ορισμός του block είναι ο εξής: Κάθε τμήμα του κώδικα που υπάρχει περίπτωση να πυροδοτήσει μια εξαίρεση θα πρέπει να την εμπερικλείουμε σε ένα try block. Το block αυτό του κώδικα θα περιγράφει τον τρόπο αντιμετώπισης της κάθε πιθανής εξαίρεσης που μπορεί να προκύψει. Ο ορισμός του block είναι ο εξής:
Line 60: Line 57:
        
 }catch (ExceptionTypeOne ex) { }catch (ExceptionTypeOne ex) {
 +
 +   /​* ​
 +    * exception handler for ExceptionTypeOne objects.
 +    */
  
 }catch (ExceptionTypeTwo ex) { }catch (ExceptionTypeTwo ex) {
 +
 +   /​* ​
 +    * exception handler for ExceptionTypeOne objects.
 +    */
  
 } }
 </​code>​ </​code>​
  
-Εντός του **try** block βάζουμε τον κώδικα που μπορεί να προκύψει μια εξαίρεση. Κάθε **catch** block ορίζει ένα διαφορετικό τύπο εξαίρεσης μέσα στη παρένθεση. Εάν η εξαίρεση που παράγεται συμπίπτει __ως προς τον τύπο__ της με ένα αντικείμενο που ορίζεται εντός της παρενθέσεως ενός **catch** block, τότε αυτό το block θα εκτελεστεί. Θα εκτελεστεί επομένως ο κώδικας αντιστοιχεί στον τύπο δεδομένων ο οποίος παράχθηκε από την εκάστοτε εξαίρεση. ​+Εντός του **try** block βάζουμε τον κώδικα που μπορεί να δημιουργηθεί μια εξαίρεση. Κάθε **catch** block ορίζει ένα διαφορετικό τύπο εξαίρεσης μέσα σε παρένθεση ​(''​ExceptionTypeOne'',​ ''​ExceptionTypeTwo'',​ κλπ). Εάν η εξαίρεση που παράγεται συμπίπτει __ως προς τον τύπο__ της με ένα αντικείμενο που ορίζεται εντός της παρενθέσεως ενός **catch** block, τότε αυτό το block θα εκτελεστεί. Θα εκτελεστεί επομένως ο κώδικας αντιστοιχεί στον τύπο δεδομένων ο οποίος παράχθηκε από την εκάστοτε εξαίρεση. ​
  
 Ας δούμε ένα μικρό τμήμα κώδικα που εντοπίζει ένα είδος εξαίρεσης το οποίο συναντήσαμε και παραπάνω:​ Ας δούμε ένα μικρό τμήμα κώδικα που εντοπίζει ένα είδος εξαίρεσης το οποίο συναντήσαμε και παραπάνω:​
Line 100: Line 105:
 </​code>​ </​code>​
  
-Όπως βλέπουμε έχουμε το προηγούμενο παράδειγμα,​ εμπλουτισμένο όμως με κώδικα διαχείρισης της διαίρεσης με το μηδέν. Ο κώδικας θα αναγνωρίσει ότι υπάρχει δημιουργείται ''​ArithmeticException''​ και συγκεκριμένα διαίρεση με το μηδέν και θα εκτυπώσει τα σχετικά μηνύματα.+Όπως βλέπουμε έχουμε το προηγούμενο παράδειγμα,​ εμπλουτισμένο όμως με κώδικα διαχείρισης της διαίρεσης με το μηδέν. Ο κώδικας θα αναγνωρίσει ότι υπάρχει δημιουργείται ''​ArithmeticException''​ και συγκεκριμένα διαίρεση με το μηδέν ​(0) και θα εκτυπώσει τα σχετικά μηνύματα.
  
-Παρακάτω δίνεται το παράδειγμα μία μεθόδου που διαβάζει ένα αρχείο κειμένου και το επιστρέφει στη μορφή ενός String.+=== Ανοίγοντας ένα αρχείο για διάβασμα === 
 + 
 +Παρακάτω δίνεται ​ένα πιο σύνθετο παράδειγμα μία μεθόδου που διαβάζει ένα αρχείο κειμένου και το επιστρέφει στη μορφή ενός String.
  
 <code java WholeFileReader.java>​ <code java WholeFileReader.java>​
Line 111: Line 118:
   ​   ​
   public String readFile(String path) {   public String readFile(String path) {
-  ​+
     try {     try {
       File file = new File (path);       File file = new File (path);
Line 118: Line 125:
       String inputLine;       String inputLine;
       StringBuffer strDocument = new StringBuffer();​       StringBuffer strDocument = new StringBuffer();​
-      ​try { +      while ((inputLine = in.readLine()) != null) { 
-        ​while ((inputLine = in.readLine()) != null) { +        strDocument.append(inputLine);​ 
-          strDocument.append(inputLine);​ +        ​//throw new IOException();​
-        ​+
-        fReader.close();​ +
-      }catch(IOException ​ex) { +
-        System.out.println("​IOException occured while reading from file "​+path);​ +
-        System.out.println("​Exiting..."​);​ +
-        System.exit(1);+
       }       }
 +      System.out.println("​Closing File!"​);​
 +      fReader.close();​
       return strDocument.toString();​       return strDocument.toString();​
     }     }
Line 133: Line 136:
       System.out.println("​The specified file was not found at "+ path);       System.out.println("​The specified file was not found at "+ path);
       return "";​       return "";​
 +    }   
 +    catch(IOException ex) {
 +      System.out.println("​IOException occured while reading from file "​+path);​
     }    ​     }    ​
 +    return "​Nothing to return..";​
   }   }
   ​   ​
Line 142: Line 149:
     }     }
     catch(IndexOutOfBoundsException ex) {     catch(IndexOutOfBoundsException ex) {
-      System.out.println("​No file has been specified!\n"​);​+      System.out.println("​No file has been specified ​from command line!\n");
     }     }
   }   }
Line 148: Line 155:
 } }
 </​code>​ </​code>​
 +
 +Παρατηρήστε ότι εμφανίζονται δύο **catch** blocks. Το πρώτο catch block αφορά [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​IOException.html|ΙΟException]] objects, ενώ το δεύτερο catch block αφορά [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​FileNotFoundException.html|FileNotFoundException]] objects. Από τους συνδέσμους που παρατίθενται θα παρατηρήσετε ότι το ''​FileNotFoundException''​ είναι υποκλάση του ''​IOException''​. Ο παραπάνω κώδικας θα μπορούσε να παραλείπει τις γραμμές
 +
 +<code java>
 +    catch(FileNotFoundException ex) {
 +      System.out.println("​The specified file was not found at "+ path);
 +      return "";​
 +    }   
 +</​code>​
 +
 +καθώς ο μη εντόπισμός αρχείου θα ενέπιπτε σε ''​IOException''​ που είναι η γονική κλάση του ''​FileNotFoundException''​. Σε αυτή την περίπτωση όμως όταν θα συνέβαινε κάποιο Exception δεν θα γνωρίζαμε εάν υπάρχει το αρχείο αλλά δεν μπορούμε να το διαβάσουμε ή δεν υπάρχει καθόλου το αρχείο που θέλουμε να διαβάσουμε στο filesystem. ​
 +
 +Επίσης,​ δεν θα είχε κανένα νόημα να βάλουμε τα catch blocks με ανάποδη σειρά δηλ.
 +<code java>
 +    catch(IOException ex) {
 +      System.out.println("​IOException occured while opening file or reading from file "​+path);​
 +    }    ​
 +    catch(FileNotFoundException ex) {
 +      System.out.println("​The specified file was not found at "+ path);
 +      return "";​
 +    }
 +</​code>​
 +Σε αυτή την περίπτωση,​ ακόμη και ένα Exception του τύπου ''​FileNotFoundException''​ θα διαχειριστεί από το πρώτο block που διαχειρίζεται τα ''​IOExcetpions''​.
 +
 +Τέλος, στο παραπάνω παράδειγμα βγάλτε τα σχόλια από την γραμμή ''​throw new IOException();''​
 +<code java>
 +     while ((inputLine = in.readLine()) != null) {
 +        strDocument.append(inputLine);​
 +        //throw new IOException();​
 +      }
 +</​code>​
 +για να δημιουργήσετε ένα ''​IOException''​ και παρατηρήστε την πορεία του κώδικα.
  
 ==== Finaly Block ==== ==== Finaly Block ====
  
-Εκτός από τα **catch** blocks τα οποία εκτελούνται όταν έχουμε κάποιο exception, μπορούμε να προσθέσουμε ένα finaly block το οποίο θα εκτελεστεί __σε κάθε περίπτωση__. Το finaly block θα εκτελεστεί ακόμη και σε περίπτωση που προκύψει μια εξαίρεση ενός τύπου που δεν έχουμε φροντίσει να συμπεριλάβουμε ή εάν δεν προκύψει καμία απολύτως εξαίρεση.+Εκτός από τα **catch** blocks τα οποία εκτελούνται όταν έχουμε κάποιο exception, μπορούμε να προσθέσουμε ένα finaly block το οποίο θα εκτελεστεί __σε κάθε περίπτωση__. Το finaly block θα εκτελεστεί ​στις παρακάτω περιπτώσεις: 
 +  * Εάν ​προκύψει η εξαίρεση που ​έχουμε φροντίσει να διαχειριστούμε (στο παρακάτω παράδειγμα FileNotFoundException). 
 +  * Εάν ​προκύψει μια εξαίρεση ενός τύπου που δεν έχουμε φροντίσει να διαχειριστούμε
 +  * Εάν δεν προκύψει καμία απολύτως εξαίρεση.
  
 +Δείτε το παρακάτω παράδειγμα όπου ενσωματώνει ένα **finally** block.
 <code java> <code java>
 import java.io.*; import java.io.*;
Line 214: Line 257:
 </​code>​ </​code>​
  
-Ο λόγος που ​μπορούμε ​να χρησιμοποιήσουμε το finaly ​block είναι για να συμπεριλάβουμε κώδικα που θέλουμε να εκτελεστεί σε όλες τις περιπτώσεις,​ όπως για παράδειγμα να κλείσουμε ελεγχόμενα τα αρχεία του προγράμματος. Στο παραπάνω παράδειγμα παραλάσεται η μέθοδος ReadFile του προηγούμενου παραδείγματος,​ ώστε στο //finally// block η μέθοδος κλείνει το αρχείο που άνοιξε. Η διαφορά σε σχέση με την προηγούμενη μέθοδο είναι ότι ακόμη και εάν δημιουργηθεί ένα exception την ώρα που διαβάζουμε η ροή του προγράμματος θα περάσει από το finally block και το αρχείο θα κλείσει. Αυτό δεν ισχύει ​για το προηγούμενο παράδειγμα.+Ο λόγος που ​συνήθως ​χρησιμοποιήσουμε το **finally** ​block είναι για να συμπεριλάβουμε κώδικα που θέλουμε να εκτελεστεί σε όλες τις περιπτώσεις,​ όπως για παράδειγμα να κλείσουμε ελεγχόμενα τα αρχεία του προγράμματος ​ή να κλείσουμε δικτυακές συνδέσεις (π.χ. συνδέσεις με βάσεις δεδομένων κ.α.). Στο παραπάνω παράδειγμα παραλλάσσεται η μέθοδος ReadFile του προηγούμενου παραδείγματος,​ ώστε στο //finally// block η μέθοδος κλείνει το αρχείο που άνοιξε. Η διαφορά σε σχέση με την προηγούμενη μέθοδο είναι ότι ακόμη και εάν δημιουργηθεί ένα exception την ώρα που διαβάζουμε η ροή του προγράμματος θα περάσει από το finally block και το αρχείο θα κλείσει. Αυτό δεν ισχύει ​στο παράδειγμα που δώσαμε ​προηγούμενα.
 ====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ====== ====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ======
  
java/exceptions_intro.txt · Last modified: 2019/04/20 05:02 by gthanos