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:36]
gthanos [Exception Handler]
java:exceptions_intro [2015/03/03 07:14]
gthanos [Finaly Block]
Line 127: Line 127:
       while ((inputLine = in.readLine()) != null) {       while ((inputLine = in.readLine()) != null) {
         strDocument.append(inputLine);​         strDocument.append(inputLine);​
 +        //throw new IOException();​
       }       }
 +      System.out.println("​Closing File!"​);​
       fReader.close();​       fReader.close();​
       return strDocument.toString();​       return strDocument.toString();​
Line 136: Line 138:
     }        }   
     catch(IOException ex) {     catch(IOException ex) {
-      System.out.println("​IOException occured while opening file or reading from file "+path); +      System.out.println("​IOException occured while reading from file "​+path);​
-      System.out.println("​Exiting..."​);​ +
-      System.exit(1);+
     }    ​     }    ​
-    return "";​+    return "Nothing to return..";
   }   }
   ​   ​
Line 153: Line 153:
   }   }
  
-}</​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 ====
Line 170: Line 203:
   ​   ​
   public String readFile(String path) {   public String readFile(String path) {
-    ​FileReader fReader = null; + 
-  ​+  ​FileReader fReader = null;
     try {     try {
       File file = new File (path);       File file = new File (path);
Line 178: Line 211:
       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();​
-        ​+
-        ​+
       }       }
-      ​catch(IOException ex) { +      ​fReader.close();
-        System.out.println("​IOException occured while reading from file "​+path);​ +
-        System.out.println("​Exiting..."​);​ +
-        System.exit(1); +
-      }      ​+
       return strDocument.toString();​       return strDocument.toString();​
     }     }
     catch(FileNotFoundException ex) {     catch(FileNotFoundException ex) {
-      System.out.println("​The specified file was not found at "+ path);+      System.out.println("​The specified file was not found!");
       return "";​       return "";​
 +    }
 +    catch(IOException ex) {
 +      System.out.println("​IOException occured while reading from file "​+path);​
     }     }
     finally {     finally {
-      if( fReader != null) { +      if(fReader!=null) { 
-        try { +        try{ 
-          System.out.println("​Closing file"​);​+          System.out.println("​Closing file!");
           fReader.close();​           fReader.close();​
-        } +        }
         catch(IOException ex) {         catch(IOException ex) {
-          System.out.println("​IOException occured while reading from file "+path); +          System.out.println("​IOException occured while closing ​file "​+path);​
-          System.out.println("​Exiting..."​);​ +
-          System.exit(1);+
         }         }
       }       }
 +      else {
 +        System.out.println("​File already closed!"​);​
 +      }
 +      ​
     }     }
-    ​+    ​return "";​
   }   }
   ​   ​
Line 217: Line 249:
     }     }
     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 225: Line 257:
  
 Ο λόγος που συνήθως χρησιμοποιήσουμε το **finally** block είναι για να συμπεριλάβουμε κώδικα που θέλουμε να εκτελεστεί σε όλες τις περιπτώσεις,​ όπως για παράδειγμα να κλείσουμε ελεγχόμενα τα αρχεία του προγράμματος ή να κλείσουμε δικτυακές συνδέσεις (π.χ. συνδέσεις με βάσεις δεδομένων κ.α.). Στο παραπάνω παράδειγμα παραλλάσσεται η μέθοδος ReadFile του προηγούμενου παραδείγματος,​ ώστε στο //finally// block η μέθοδος κλείνει το αρχείο που άνοιξε. Η διαφορά σε σχέση με την προηγούμενη μέθοδο είναι ότι ακόμη και εάν δημιουργηθεί ένα exception την ώρα που διαβάζουμε η ροή του προγράμματος θα περάσει από το finally block και το αρχείο θα κλείσει. Αυτό δεν ισχύει στο παράδειγμα που δώσαμε προηγούμενα. Ο λόγος που συνήθως χρησιμοποιήσουμε το **finally** block είναι για να συμπεριλάβουμε κώδικα που θέλουμε να εκτελεστεί σε όλες τις περιπτώσεις,​ όπως για παράδειγμα να κλείσουμε ελεγχόμενα τα αρχεία του προγράμματος ή να κλείσουμε δικτυακές συνδέσεις (π.χ. συνδέσεις με βάσεις δεδομένων κ.α.). Στο παραπάνω παράδειγμα παραλλάσσεται η μέθοδος ReadFile του προηγούμενου παραδείγματος,​ ώστε στο //finally// block η μέθοδος κλείνει το αρχείο που άνοιξε. Η διαφορά σε σχέση με την προηγούμενη μέθοδο είναι ότι ακόμη και εάν δημιουργηθεί ένα exception την ώρα που διαβάζουμε η ροή του προγράμματος θα περάσει από το finally block και το αρχείο θα κλείσει. Αυτό δεν ισχύει στο παράδειγμα που δώσαμε προηγούμενα.
 +
 +Στο παραπάνω παράδειγμα δείτε την πορεία του κώδικα βγάζοντας τα σχόλια και βάζοντας σε σχόλια την γραμμή που δημιουργεί το ''​IOException''​.
 +<code java>
 +      while ((inputLine = in.readLine()) != null) {
 +        strDocument.append(inputLine);​
 +        //throw new IOException();​
 +      }
 +</​code>​
 ====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ====== ====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ======
  
java/exceptions_intro.txt · Last modified: 2019/04/20 05:02 by gthanos