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 07:33]
gthanos [Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο]
java:exceptions_intro [2019/04/05 17:36]
gthanos [Αντικείμενο της εξαίρεσης (exception object)]
Line 1: Line 1:
-====== ​Τι είναι η εξαίρεση (Exception)======+====== ​Εξαιρέσεις (Exceptions) ======
  
-Σε αυτή την ενότητα θα αναφερθούμε σε αντικείμενα τα οποία δημιουργούνται κατά την ροή εκτέλεσης ενός προγράμματος,​ όταν συμβαίνει κάτι αναπάντεχο ή μη διαχειρίσιμο από το πρόγραμμα. Σε αυτές της περιπτώσεις παράγεται ένα νέο αντικείμενο που ονομάζεται "​εξαίρεση"​ (exception),​ με παράλληλη διακοπή της κανονικής ροής του προγράμματος. Ο προγραμματιστής καλείται να διαχειριστεί μέσα από επιπλέον κώδικα τις πιθανές εξαιρέσεις,​ και κατ'​ επέκταση να διαχειριστεί ομαλά τα γεγονότα από τα οποία προέρχονται.+Σε αυτή την ενότητα θα αναφερθούμε σε αντικείμενα τα οποία δημιουργούνται κατά την ροή εκτέλεσης ενός προγράμματος,​ όταν συμβαίνει κάτι αναπάντεχο ή μη διαχειρίσιμο από το πρόγραμμα. Σε αυτές της περιπτώσεις παράγεται ένα νέο αντικείμενο που ονομάζεται "​εξαίρεση"​ (//exception//), με παράλληλη διακοπή της κανονικής ροής του προγράμματος. Ο προγραμματιστής καλείται να διαχειριστεί μέσα από επιπλέον κώδικα τις πιθανές εξαιρέσεις,​ και κατ'​ επέκταση να διαχειριστεί ομαλά τα γεγονότα από τα οποία προέρχονται.
  
-Για να διασφαλίσουμε ότι το πρόγραμμά μας θα συνεχίσει την εκτέλεσή του ακόμη και αν συμβεί ένα απροσδόκητο γεγονός,​ χρησιμοποιούμε τον μηχανισμό διαχείρισης των **εξαιρέσεων (exceptions)**. Το βασικό πλεονέκτημα που μας προσδίδει η χρήση των εξαιρέσεων είναι το γεγονός ότι μπορούμε να επιλέξουμε σε ποιο σημείο του προγράμματος θα διαχειριστούμε την εξαίρεση που έχει προκύψει.+Για να διασφαλίσουμε ότι το πρόγραμμά μας θα συνεχίσει την εκτέλεσή του ακόμη και αν συμβεί ένα απροσδόκητο γεγονός,​ χρησιμοποιούμε τον μηχανισμό διαχείρισης των **εξαιρέσεων (exceptions)**. ​
  
  
 ====== Αντικείμενο της εξαίρεσης (exception object) ====== ====== Αντικείμενο της εξαίρεσης (exception object) ======
-Οτιδήποτε υπάρχει στην γλώσσα Java δεν είναι κάτι διαφορετικό απο αντικείμενο. Έτσι, ακόμη και οι εξαιρέσεις που μπορούν να προκληθούν,​ παράγουν ένα αντικείμενο το οποίο περιέχει όλες τις πληροφορίες που έχουν να κάνουν με το λάθος το οποίο έχει προκύψει όπως ο τύπος του λάθους και την κατάσταση που βρισκόταν το σύστημα όταν έγινε το λάθος αυτό. 
  
-Σε αυτό το σημείο ας δούμε ένα πολύ απλό και συχνό λάθος που μπορεί να προκύψει αν δεν το προσέξουμε εμείς ή ο χρήστης.+Κάθε εξαίρεση που μπορεί να προκληθεί παράγει ένα αντικείμενο το οποίο περιέχει όλες τις πληροφορίες που έχουν να κάνουν με το λάθος το οποίο έχει προκύψει,​ όπως ο τύπος του λάθους και την κατάσταση που βρισκόταν το πρόγραμμα όταν έγινε το λάθος αυτό. 
 + 
 +Σε αυτό το σημείο ας δούμε ένα πολύ απλό και συχνό λάθος που μπορεί να προκύψει αν δεν ​λάβει σχετική μέριμνα ​ο προγραμματιστής.
  
 <code java TestDivideByZero.java>​ <code java TestDivideByZero.java>​
Line 37: Line 38:
 Τι θα συμβεί στο παραπάνω πρόγραμμα αν ο 2ος αριθμός που θα δώσει ο χρήστης είναι 0; Επίσης αν ο χρήστης δεν δώσει αριθμό σαν είσοδο αλλά γράμμα;​ Τι θα συμβεί στο παραπάνω πρόγραμμα αν ο 2ος αριθμός που θα δώσει ο χρήστης είναι 0; Επίσης αν ο χρήστης δεν δώσει αριθμό σαν είσοδο αλλά γράμμα;​
  
-Όπως καταλαβαίνουμε,​ θα πρέπει να προβλέψουμε όλες τις περιπτώσεις (ή τουλάχιστον τις πιο βασικές) στις οποίες ο χρήστης είτε από λάθος είτε επειδή είναι κακόβουλος θα δώσει σαν είσοδο κάτι το οποίο δεν είναι σωστό και θα προκαλέσει πρόβλημα. Το παραπάνω παράδειγμα είναι ένα από τα προβλήματα που μπορούν να δημιουργηθούν σε ένα πρόγραμμα ​και θα πρέπει να το καλύψουμε ​με σκοπό **να μην σταματήσει η εκτέλεση του προγράμματος**.+Όπως καταλαβαίνουμε,​ θα πρέπει να προβλέψουμε όλες τις περιπτώσεις (ή τουλάχιστον τις πιο βασικές) στις οποίες ο χρήστης είτε από λάθος είτε επειδή είναι κακόβουλος θα δώσει σαν είσοδο κάτι το οποίο δεν είναι σωστό και θα προκαλέσει πρόβλημα. Το παραπάνω παράδειγμα είναι ένα από τα προβλήματα που μπορούν να δημιουργηθούν σε ένα πρόγραμμα. Ο προγραμματιστής καλείται να το αντιμετωπίσει προκειμένου **να μην σταματήσει η εκτέλεση του προγράμματος**.
  
-Στο παραπάνω παράδειγμα συνεπώς,​ το σύστημα θα παράξει ένα αντικείμενο που θα περιγράφει το είδος του λάθους που συνέβη. ​Πρέπει εμείς ​με κάποιον τρόπο+Στο παραπάνω παράδειγμα συνεπώς,​ το σύστημα θα παράξει ένα αντικείμενο που θα περιγράφει το είδος του λάθους που συνέβη. ​Ο προγραμματιστής πρέπει
-  - να λάβουμε αυτό ​το αντικείμενο +  - να λάβει το αντικείμενο 
-  - να δούμε το λάθος που έχει προκύψει +  - να εξετάσει ​το λάθος που έχει προκύψει 
-  - να αντιμετωπίσουμε το λάθος ​έτσι ​ώστε το πρόγραμμά ​μας ​να επιστρέψει σε μια "σωστή" κατάσταση.+  - να αντιμετωπίσει το λάθοςώστε το πρόγραμμά να επιστρέψει σε ένα σημείο από όπου μπορεί να συνεχίσει τη λειτουργία του χωρίς πρόβλημα.
  
-====== Try - catch block ====== +ροηγούμενο: [[:​java:​instanceof| Τελεστής instanceof ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[:​java:​exceptions_try_catch_block | Διαχείριση Εξαιρέσεων]]|
-Στην προηγούμενη υποενότητα αναφερθήκαμε συνοπτικά στο αντικείμενο της εξαίρεσης. Εδώ θα δόυμε τον τρόπο με τον οποίο διαχειριζόμαστε τις εξαιρέσεις.  +
-==== Exception Handler ==== +
-Κάθε τμήμα του κώδικα που υπάρχει περίπτωση να πυροδοτήσει μια εξαίρεση θα πρέπει να την εμπερικλείουμε σε ένα try block. Το block αυτό του κώδικα θα περιγράφει τον τρόπο αντιμετώπισης της κάθε πιθανής εξαίρεσης που μπορεί να προκύψει. Ο ορισμός του block είναι ο εξής:+
  
-<code java> 
-try{ 
- 
-   /​* ​ 
-    * code that may throw an exception here. 
-    */ 
-    
-}catch (ExceptionTypeOne ex) { 
- 
-   /​* ​ 
-    * exception handler for ExceptionTypeOne objects. 
-    */ 
- 
-}catch (ExceptionTypeTwo ex) { 
- 
-   /​* ​ 
-    * exception handler for ExceptionTypeOne objects. 
-    */ 
- 
-} 
-</​code>​ 
- 
-Εντός του **try** block βάζουμε τον κώδικα που μπορεί να δημιουργηθεί μια εξαίρεση. Κάθε **catch** block ορίζει ένα διαφορετικό τύπο εξαίρεσης μέσα σε παρένθεση (''​ExceptionTypeOne'',​ ''​ExceptionTypeTwo'',​ κλπ). Εάν η εξαίρεση που παράγεται συμπίπτει __ως προς τον τύπο__ της με ένα αντικείμενο που ορίζεται εντός της παρενθέσεως ενός **catch** block, τότε αυτό το 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>​ 
- 
-Όπως βλέπουμε έχουμε το προηγούμενο παράδειγμα,​ εμπλουτισμένο όμως με κώδικα διαχείρισης της διαίρεσης με το μηδέν. Ο κώδικας θα αναγνωρίσει ότι υπάρχει δημιουργείται ''​ArithmeticException''​ και συγκεκριμένα διαίρεση με το μηδέν (0) και θα εκτυπώσει τα σχετικά μηνύματα. 
- 
-=== Ανοίγοντας ένα αρχείο για διάβασμα === 
- 
-Παρακάτω δίνεται ένα πιο σύνθετο παράδειγμα μία μεθόδου που διαβάζει ένα αρχείο κειμένου και το επιστρέφει στη μορφή ενός String. 
- 
-<code java WholeFileReader.java>​ 
-import java.io.*; 
-import java.lang.*;​ 
- 
-public class WholeFileReader { 
-  ​ 
-  public String readFile(String path) { 
- 
-    try { 
-      File file = new File (path); 
-      FileReader fReader = new FileReader(file);​ 
-      BufferedReader in = new BufferedReader(fReader);​ 
-      String inputLine; 
-      StringBuffer strDocument = new StringBuffer();​ 
-      while ((inputLine = in.readLine()) != null) { 
-        strDocument.append(inputLine);​ 
-        //throw new IOException();​ 
-      } 
-      System.out.println("​Closing File!"​);​ 
-      fReader.close();​ 
-      return strDocument.toString();​ 
-    } 
-    catch(FileNotFoundException ex) { 
-      System.out.println("​The specified file was not found at "+ path); 
-      return "";​ 
-    }    
-    catch(IOException ex) { 
-      System.out.println("​IOException occured while reading from file "​+path);​ 
-    }    ​ 
-    return "​Nothing to return..";​ 
-  } 
-  ​ 
-  public static void main(String args[]) { 
-    WholeFileReader wfr = new WholeFileReader();​ 
-    try { 
-      System.out.println(wfr.readFile(args[0]) ); 
-    } 
-    catch(IndexOutOfBoundsException ex) { 
-      System.out.println("​No file has been specified from command line!\n"​);​ 
-    } 
-  } 
- 
-} 
-</​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 ==== 
- 
-Εκτός από τα **catch** blocks τα οποία εκτελούνται όταν έχουμε κάποιο exception, μπορούμε να προσθέσουμε ένα finaly block το οποίο θα εκτελεστεί __σε κάθε περίπτωση__. Το finaly block θα εκτελεστεί στις παρακάτω περιπτώσεις:​ 
-  * Εάν προκύψει η εξαίρεση που έχουμε φροντίσει να διαχειριστούμε (στο παρακάτω παράδειγμα FileNotFoundException). 
-  * Εάν προκύψει μια εξαίρεση ενός τύπου που δεν έχουμε φροντίσει να διαχειριστούμε. 
-  * Εάν δεν προκύψει καμία απολύτως εξαίρεση. 
- 
-Δείτε το παρακάτω παράδειγμα όπου ενσωματώνει ένα **finally** block. 
-<code java> 
-import java.io.*; 
-import java.lang.*;​ 
- 
-public class WholeFileReader { 
-  ​ 
-  public String readFile(String path) { 
- 
-  FileReader fReader = null; 
-    try { 
-      File file = new File (path); 
-      fReader = new FileReader(file);​ 
-      BufferedReader in = new BufferedReader(fReader);​ 
-      String inputLine; 
-      StringBuffer strDocument = new StringBuffer();​ 
-      while ((inputLine = in.readLine()) != null) { 
-        strDocument.append(inputLine);​ 
-        //throw new IOException();​ 
-      } 
-      fReader.close();​ 
-      return strDocument.toString();​ 
-    } 
-    catch(FileNotFoundException ex) { 
-      System.out.println("​The specified file was not found!"​);​ 
-      return "";​ 
-    } 
-    catch(IOException ex) { 
-      System.out.println("​IOException occured while reading from file "​+path);​ 
-    } 
-    finally { 
-      if(fReader!=null) { 
-        try{ 
-          System.out.println("​Closing file!"​);​ 
-          fReader.close();​ 
-        } 
-        catch(IOException ex) { 
-          System.out.println("​IOException occured while closing file "​+path);​ 
-        } 
-      } 
-      else { 
-        System.out.println("​File already closed!"​);​ 
-      } 
-      ​ 
-    } 
-    return "";​ 
-  } 
-  ​ 
-  public static void main(String args[]) { 
-    WholeFileReader wfr = new WholeFileReader();​ 
-    try { 
-      System.out.println(wfr.readFile(args[0]) ); 
-    } 
-    catch(IndexOutOfBoundsException ex) { 
-      System.out.println("​No file has been specified from command line!\n"​);​ 
-    } 
-  } 
- 
-} 
-</​code>​ 
- 
-Ο λόγος που συνήθως χρησιμοποιήσουμε το **finally** block είναι για να συμπεριλάβουμε κώδικα που θέλουμε να εκτελεστεί σε όλες τις περιπτώσεις,​ όπως για παράδειγμα να κλείσουμε ελεγχόμενα τα αρχεία του προγράμματος ή να κλείσουμε δικτυακές συνδέσεις (π.χ. συνδέσεις με βάσεις δεδομένων κ.α.). Στο παραπάνω παράδειγμα παραλλάσσεται η μέθοδος ReadFile του προηγούμενου παραδείγματος,​ ώστε στο //finally// block η μέθοδος κλείνει το αρχείο που άνοιξε. Η διαφορά σε σχέση με την προηγούμενη μέθοδο είναι ότι ακόμη και εάν δημιουργηθεί ένα exception την ώρα που διαβάζουμε η ροή του προγράμματος θα περάσει από το finally block και το αρχείο θα κλείσει. Αυτό δεν ισχύει στο παράδειγμα που δώσαμε προηγούμενα. 
- 
-Στο παραπάνω παράδειγμα δείτε την πορεία του κώδικα βγάζοντας τα σχόλια και βάζοντας σε σχόλια την γραμμή που δημιουργεί το ''​IOException''​. 
-<code java> 
-      while ((inputLine = in.readLine()) != null) { 
-        strDocument.append(inputLine);​ 
-        //throw new IOException();​ 
-      } 
-</​code>​ 
-====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ====== 
- 
-Στην προηγούμενη ενότητα δείξαμε πως μπορούμε να χειριστούμε μια εξαίρεση όταν προκύπτει. Η Java μας δίνει την δυνατότητα να μην διαχειριστούμε την εξαίρεση μέσα στην μέθοδο που προκύπτει,​ αλλά να σε κάποια άλλη μέθοδο πιο πάνω που καλεί την μέθοδο που προκύπτει. Ας ξαναδούμε το προηγούμενο παράδειγμα ελαφρά παραλλαγμένο. ​ 
- 
-  - Κατ'​ αρχήν διαχωρίζουμε το ''​FileNotFoundException''​ από to ''​IOException''​ σε δύο διαφορετικά try blocks. 
-  - Στην συνέχεια κάνουμε comment-out τις γραμμές που ελέγχουν το ''​FileNotFoundException''​ και αντ'​ αυτού προσθέτουμε μία δήλωση ''​throws FileNotFoundException''​ στην δήλωση της μεθόδου. 
-  - Τέλος διαχειριζόμαστε την εξαίρεση μέσα στη μέθοδο ''​main''​. 
- 
-<code java> 
- 
-import java.io.*; 
-import java.lang.*;​ 
- 
-public class WholeFileReader { 
-  ​ 
-  public String readFile(String path) throws FileNotFoundException { 
-    FileReader fReader = null; 
-  ​ 
-    try { 
-      File file = new File (path); 
-      fReader = new FileReader(file);​ 
-      BufferedReader in = new BufferedReader(fReader);​ 
-      String inputLine; 
-      StringBuffer strDocument = new StringBuffer();​ 
-      try { 
-        while ((inputLine = in.readLine()) != null) { 
-          strDocument.append(inputLine);​ 
-        } 
-        ​ 
-      } 
-      catch(IOException ex) { 
-        System.out.println("​IOException occured while reading from file "​+path);​ 
-        System.out.println("​Exiting..."​);​ 
-        System.exit(1);​ 
-      }      ​ 
-      return strDocument.toString();​ 
-    } 
-    /* //Remove exception from here. Handle it at a higher level 
-    catch(FileNotFoundException ex) { 
-      System.out.println("​The specified file was not found at "+ args[0]); 
-    }*/ 
-    finally { 
-      if( fReader != null) { 
-        try { 
-          System.out.println("​Closing file"​);​ 
-          fReader.close();​ 
-        }  
-        catch(IOException ex) { 
-          System.out.println("​IOException occured while reading from file "​+path);​ 
-          System.out.println("​Exiting..."​);​ 
-          System.exit(1);​ 
-        } 
-      } 
-    } 
-    ​ 
-  } 
-  ​ 
-  public static void main(String args[]) { 
-    WholeFileReader wfr = new WholeFileReader();​ 
-    try { 
-      System.out.println(wfr.readFile(args[0]) ); 
-    } 
-    catch(IndexOutOfBoundsException ex) { 
-      System.out.println("​No file has been specified!\n"​);​ 
-    } 
-    catch(FileNotFoundException ex) { 
-      System.out.println("​The specified file was not found at "+ args[0]); 
-    } 
-  } 
- 
-} 
-</​code>​ 
- 
-Στον παραπάνω κώδικα βλέπουμε την περίπτωση στην οποία __δεν__ διαχειριζόμαστε την εξαίρεση εντός της μεθόδου ''​readFile''​ αλλά αφήνουμε να περνάμε την εξαίρεση στην μέθοδο που την καλεί (στην περίπτωση μας η ''​main''​) και την διαχειριζόμαστε εκεί. Eφόσον δεν διαχειριζόμαστε το Exception στην δήλωση της μεθόδου υπάρχει η επιπλέον δήλωση ''​throws FileNotFoundException'',​ όπου περιγράφεται ποια Exceptions μπορεί να "​πετάξει"​ η κάθε μέθοδος στις μεθόδους που την καλούν. Μία μέθοδος μπορεί να κάνει **throw** περισσότερα του ενός Exceptions. Η δήλωση throw υποχρεώνει τον compiler να βγάλει error  
-  * εάν δεν διαχειριστούμε το Exception στην μέθοδο από την οποία καλούμε την μέθοδο με την δήλωση **throw**. 
-  * ή εάν δεν έχουμε μία δήλωση **throw** στην μέθοδο από την οποία καλούμε την εν λόγω μέθοδο. 
- 
-====== Πυροδότηση μιας εξαίρεσης ====== 
-Στις προηγούμενες ενότητες είδαμε τον τρόπο με τον οποίο χειριζόμαστε μια εξαίρεση. Μέχρι αυτό το σημείο έχουμε αναφερθεί σε εξαιρέσεις που παρέχονται από κλάσεις του συστήματος. Πως όμως δημιουργούνται αυτές οι εξαιρέσεις και πως και εμείς μπορούμε να καλέσουμε μια εξαίρεση;​ 
- 
-Επανερχόμενοι στο παράδειγμα ανάγνωσης ενός αρχείου ας υποθέσουμε ότι θέλουμε να δημιουργούμε μία εξαίρεση αν το αρχείο είναι άδειο, δηλ δεν περιέχει κανένα χαρακτήρα. Για τον σκοπό αυτό δημιουργούμε ένα νέο τύπο εξαίρεσης με όνομα ''​EmptyFileException''​. ​ 
- 
-<code java EmptyFileException.java>​ 
-public class EmptyFileException extends java.lang.Exception { 
-} 
-</​code>​ 
- 
-Όπως τονίσαμε και παραπάνω η εξαίρεση είναι και αυτή ένα αντικείμενο. Για να καλέσουμε ένα αντικείμενο εξαίρεσης το μόνο που έχουμε να κάνουμε είναι να βάλουμε τη δεσμευμένη λέξη **throw** και δίπλα το αντικείμενο της εξαίρεσης που θέλουμε να καλέσουμε. Στο παρακάτω παράδειγμα,​ εάν μετά την ολοκλήρωση διαβάσματος του αρχείου αντιληφθούμε ότι το αρχείο που διαβάσαμε ήταν κενό τότε το πρόγραμμα μας δημιουργεί το παραπάνω Exception. Δείτε τον κώδικα. 
- 
-<code java > 
-import java.io.*; 
-import java.lang.*;​ 
- 
-public class WholeFileReader { 
-  ​ 
-  public String readFile(String path) throws FileNotFoundException,​ EmptyFileException { 
-    FileReader fReader = null; 
-  ​ 
-    try { 
-      File file = new File (path); 
-      fReader = new FileReader(file);​ 
-      BufferedReader in = new BufferedReader(fReader);​ 
-      String inputLine; 
-      StringBuffer strDocument = new StringBuffer();​ 
-      try { 
-        while ((inputLine = in.readLine()) != null) { 
-          strDocument.append(inputLine);​ 
-        } 
-        ​ 
-      } 
-      catch(IOException ex) { 
-        System.out.println("​IOException occured while reading from file "​+path);​ 
-        System.out.println("​Exiting..."​);​ 
-        System.exit(1);​ 
-      } 
-      if( strDocument.toString().isEmpty() ) { 
-         throw new EmptyFileException();​ 
-      } 
-      return strDocument.toString();​ 
-    } 
-    ​ 
-    finally { 
-      if( fReader != null) { 
-        try { 
-          //​System.out.println("​Closing file"​);​ 
-          fReader.close();​ 
-        }  
-        catch(IOException ex) { 
-          System.out.println("​IOException occured while reading from file "​+path);​ 
-          System.out.println("​Exiting..."​);​ 
-          System.exit(1);​ 
-        } 
-      } 
-    } 
-    ​ 
-  } 
-  ​ 
-  public static void main(String args[]) { 
-    WholeFileReader wfr = new WholeFileReader();​ 
-    try { 
-      System.out.println(wfr.readFile(args[0]) ); 
-    } 
-    catch(IndexOutOfBoundsException ex) { 
-      System.out.println("​No file has been specified!\n"​);​ 
-    } 
-    catch(FileNotFoundException ex) { 
-      System.out.println("​The specified file was not found at "+ args[0]); 
-    } 
-    catch(EmptyFileException ex) { 
-      System.out.println("​File is empty!!!"​);​ 
-    } 
-  } 
- 
-} 
-</​code>​ 
- 
- 
- 
- 
-  
java/exceptions_intro.txt · Last modified: 2019/04/20 05:02 by gthanos