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 16:34]
gthanos [Exception Handler]
java:exceptions_intro [2015/03/02 17:07]
gthanos [Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο]
Line 153: Line 153:
 ==== Finaly Block ==== ==== Finaly Block ====
  
-Εκτός από τα **catch** blocks τα οποία εκτελούνται όταν έχουμε κάποιο exception, μπορούμε να προσθέσουμε ένα finaly block το οποίο θα εκτελεστεί σε κάθε περίπτωση. Το finaly block θα εκτελεστεί ακόμη και σε περίπτωση που προκύψει μια εξαίρεση ενός τύπου που δεν έχουμε φροντίσει να συμπεριλάβουμε ή δεν προκύψει καμία εξαίρεση.+Εκτός από τα **catch** blocks τα οποία εκτελούνται όταν έχουμε κάποιο exception, μπορούμε να προσθέσουμε ένα finaly block το οποίο θα εκτελεστεί ​__σε κάθε περίπτωση__. Το finaly block θα εκτελεστεί ακόμη και σε περίπτωση που προκύψει μια εξαίρεση ενός τύπου που δεν έχουμε φροντίσει να συμπεριλάβουμε ή εάν ​δεν προκύψει καμία ​απολύτως ​εξαίρεση.
  
 <code java> <code java>
-try {+import java.io.*;​ 
 +import java.lang.*;​
  
-  ​File file = new File ("​C:/​Users/​Me/​Desktop/​directory/​file.txt"​); +public class WholeFileReader { 
-  ​PrintWriter printWriter ​= new PrintWriter ​(file); +   
-  ​printWriter.println ​("​hello"​); +  public String readFile(String path) { 
-  ​printWriter.close (); +    FileReader fReader = null; 
- +   
-} catch (IndexOutOfBoundsException e) { +    try { 
-    System.err.println("​IndexOutOfBoundsException: ​" + e.getMessage()); +      ​File file = new File (path); 
-} catch (IOException e) { +      ​fReader ​= new FileReader(file); 
-    System.err.println("​Caught IOException: ​" + e.getMessage()); +      ​BufferedReader in = new BufferedReader(fReader); 
-}finally { +      ​String inputLine;​ 
-    if (out != null) {  +      StringBuffer strDocument = new StringBuffer();​ 
-        System.out.println("​Closing ​PrintWriter"); +      try { 
-        out.close();  +        while ((inputLine = in.readLine()) != null) { 
-    } else {  +          strDocument.append(inputLine); 
-        System.out.println("​PrintWriter not open"); +        } 
-    }  +         
-+      ​} 
 +      ​catch(IOException ex) { 
 +        System.out.println("​IOException occured while reading from file "+path); 
 +        System.out.println("​Exiting..."​)
 +        System.exit(1); 
 +            
 +      return strDocument.toString();​ 
 +    } 
 +    ​catch(FileNotFoundException ex) { 
 +      System.out.println("​The specified file was not found at "​+ ​path); 
 +      ​return "";​ 
 +    ​} 
 +    ​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"); 
 +    } 
 +  }
  
 +}
 </​code>​ </​code>​
  
-Ένας ​λόγος που μπορούμε να χρησιμοποιήσουμε το finaly block είναι για να συμπεριλάβουμε κώδικα που θέλουμε να εκτελεστεί σε όλες τις περιπτώσεις,​ όπως για παράδειγμα να κλείσουμε ελεγχόμενα τα αρχεία του προγράμματος. Στο παραπάνω παράδειγμα ​υπάρχει ολοκληρωμένο ένα μικρό τμήμα κώδικα που ​ανοίγει ένα ​αρχείογράφει κάτι και μετά το κλείνει το αρχείο που άνοιξε.+Ο λόγος που μπορούμε να χρησιμοποιήσουμε το finaly block είναι για να συμπεριλάβουμε κώδικα που θέλουμε να εκτελεστεί σε όλες τις περιπτώσεις,​ όπως για παράδειγμα να κλείσουμε ελεγχόμενα τα αρχεία του προγράμματος. Στο παραπάνω παράδειγμα παραλάσεται η μέθοδος ReadFile του προηγούμενου παραδείγματος, ​ώστε στο //finally// block η μέθοδος κλείνει το αρχείο ​που ​άνοιξε. Η διαφορά σε σχέση με την προηγούμενη μέθοδο είναι ότι ακόμη ​και ​εάν δημιουργηθεί ένα exception ​την ώρα που διαβάζουμε η ροή ​του προγράμματος θα περάσει από το finally block και το αρχείο θα κλείσει. Αυτό δεν ισχύει για το προηγούμενο παράδειγμα.
 ====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ====== ====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ======
-Στην προηγούμενη ενότητα δείξαμε πως μπορούμε να χειριστούμε μια εξαίρεση όταν προκύπτει. ​Υπάρχει ένας μηχανισμός που μας επιτρέπει ​να μην χειριστούμε την εξαίρεση στο σημείο που προκύπτει αλλά στο σημείο που καλείται η μέθοδος μεσα στην οποία θα προκύψει μια εξαίρεση.+ 
 +Στην προηγούμενη ενότητα δείξαμε πως μπορούμε να χειριστούμε μια εξαίρεση όταν προκύπτει. ​Η Java μας δίνει την δυνατότητα ​να μην ​διαχειριστούμε την εξαίρεση ​μέσα στην μέθοδο που προκύπτειαλλά ​να σε κάποια άλλη μέθοδο πιο πάνω ​που καλεί την μέθοδο ​που προκύπτει. Ας ξαναδούμε το προηγούμενο παράδειγμα ελαφρά παραλλαγμένο
  
 Σε προηγούμενο παράδειγμα αναφερθήκαμε στη PrintWriter class και βάλαμε ένα try-catch block για να διαχειριστούμε τη πιθανή δημιουργία μας εξαίρεσης. ​ Σε προηγούμενο παράδειγμα αναφερθήκαμε στη PrintWriter class και βάλαμε ένα try-catch block για να διαχειριστούμε τη πιθανή δημιουργία μας εξαίρεσης. ​
Line 186: Line 225:
 <code java> <code java>
  
-public void writeToFile() throws IOException,​IndexOutOfBoundsException{ +import java.io.*
- +import java.lang.*;
-  File file = new File ("​C:/​Users/​Me/​Desktop/​directory/​file.txt"​);​ +
-  PrintWriter printWriter = new PrintWriter ("file.txt")+
-  ​printWriter.println ("​hello"​);​ +
-  printWriter.close ();+
  
 +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();​
 +    }
 +    ​
 +    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>​ </​code>​
  
-Στον παραπάνω κώδικα βλέπουμε την περίπτωση στην οποία δεν διαχειριζόμαστε την εξαίρεση εντός της μεθόδου ​writeToFile ​αλλά αφήνουμε να διαχειριστεί τις εξαιρέσεις που ​μπορούν να προκύψουν, αυτός που θα καλέσει τη μέθοδο writeToFile. Το μόνο που έχουμε να κάνουμεείναι να βάλουμε τη δεσμευμένη λέξη **throws** και ​δίπλα όλες τις εξαιρέσεις ​που μπορούν ​να προκύψουν ​εντός της μεθόδου και θέλουμε να τις χειριστούμε.+Στον παραπάνω κώδικα βλέπουμε την περίπτωση στην οποία δεν διαχειριζόμαστε την εξαίρεση εντός της μεθόδου ​''​readFile'' ​αλλά αφήνουμε να περνάμε την εξαίρεση στην ​μέθοδο που την καλεί (στην περίπτωση μας η main) και την διαχειριζόμαστε εκεί. Παρατηρήστε ότι εφόσον δεν διαχειριζόμαστε το Exception στην δήλωση της ​μεθόδου υπάρχει ​η επιπλέον δήλωση ''​throws FileNotFoundException'', ​όπου περιγράφεται ποιά Exceptions ​μπορεί να "πετάξει"​ η μέθοδος στις μεθόδους που την ​καλού. Μία ​μέθοδος μπορεί να κάνει throw περισσότερα ​του ενός Exceptions.
  
 ====== Πυροδότηση μιας εξαίρεσης ====== ====== Πυροδότηση μιας εξαίρεσης ======
java/exceptions_intro.txt · Last modified: 2019/04/20 05:02 by gthanos