This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
java:exceptions_intro [2015/03/03 07:08] gthanos [Exception Handler] |
java:exceptions_intro [2015/03/03 07:14] gthanos [Finaly Block] |
||
---|---|---|---|
Line 179: | Line 179: | ||
Σε αυτή την περίπτωση, ακόμη και ένα Exception του τύπου ''FileNotFoundException'' θα διαχειριστεί από το πρώτο block που διαχειρίζεται τα ''IOExcetpions''. | Σε αυτή την περίπτωση, ακόμη και ένα Exception του τύπου ''FileNotFoundException'' θα διαχειριστεί από το πρώτο block που διαχειρίζεται τα ''IOExcetpions''. | ||
- | Τέλος, στο παραπάνω παράδειγμα βγάλτε τα σχόλια από την γραμμή για να δημιουργήσετε ένα ''IOException'' και παρατηρήστε την πορεία του κώδικα. | + | Τέλος, στο παραπάνω παράδειγμα βγάλτε τα σχόλια από την γραμμή ''throw new IOException();'' |
<code java> | <code java> | ||
- | //throw new IOException(); | + | while ((inputLine = in.readLine()) != null) { |
+ | strDocument.append(inputLine); | ||
+ | //throw new IOException(); | ||
+ | } | ||
</code> | </code> | ||
+ | για να δημιουργήσετε ένα ''IOException'' και παρατηρήστε την πορεία του κώδικα. | ||
==== Finaly Block ==== | ==== Finaly Block ==== | ||
Line 199: | 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 207: | 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 246: | 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 254: | 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> | ||
====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ====== | ====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ====== | ||