java:exceptions_thrown_by_methods

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ====== Στην προηγούμενη ενότητα δείξαμε πως μπορούμε να χειριστούμε μια εξαίρεση όταν προκύπτει. Η Java μας δίνει την δυνατότητα να μην διαχειριστούμε την εξαίρεση μέσα στην μέθοδο που δημιουργείται ή σε κάποια άλλη μέθοδο η οποία βρίσκεται πιο πάνω στην "ιεραρχία" των μεθόδων που έχουν ήδη κληθεί και βρίσκονται μέσα στην στοίβα εκτέλεσης του προγράμματος μας. Ας ξαναδούμε το προηγούμενο παράδειγμα ελαφρά παραλλαγμένο. <WRAP info 80% center round> Ας υποθέσουμε ότι έχετε τις μεθόδους **main**, **method1**, **method2**, **method3** όπου η ιεραρχία κλήσεων μεταξύ τους είναι η εξής: * Η **main** καλεί την **method1**. * Η **method1** καλεί την **method2**. * Η **method2** καλεί την **method3**. * Εάν συμβεί ένα **Exception** μέσα στη μέθοδο **method3** τότε αυτό μπορούμε να το διαχειριστούμε είτε μέσα στην **method3**, είτε μέσα στις **method2**, **method1** και **main**. * Αντίστοιχα, εάν συμβεί ένα **Exception** μέσα στη μέθοδο **method2** τότε αυτό μπορούμε να το διαχειριστούμε είτε μέσα στην **method2**, είτε μέσα στις **method1** και **main**. Η **main** είναι η τελευταία συνάρτηση στην οποία μπορεί να γίνει διαχείριση ενός exception. Εάν η διαχείριση δεν γίνει και στη main, τότε το πρόγραμμα τερματίζει εκτυπώνοντας στην κονσόλα το Exception που δημιουργήθηκε. </WRAP> - Κατ' αρχήν διαχωρίζουμε το ''FileNotFoundException'' από το ''IOException'' σε δύο διαφορετικά try blocks. - Στην συνέχεια κάνουμε comment-out τις γραμμές που ελέγχουν το ''FileNotFoundException'' και αντ' αυτού προσθέτουμε μία δήλωση ''throws FileNotFoundException'' στην δήλωση της μεθόδου. - Τέλος διαχειριζόμαστε την εξαίρεση μέσα στη μέθοδο ''main''. <code java WholeFileReader.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); } 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 closing file "+path); } } } } 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 να βγάλει σφάλμα * εάν δεν διαχειριστούμε τον συγκεκριμένο τύπο Exception στην μέθοδο από την οποία καλούμε την μέθοδο με την δήλωση **throw**. * ή εάν δεν έχουμε μία δήλωση **throw** για το συγκεκριμένο τύπο Exception στην δήλωση της μεθόδου από την οποία καλούμε την εν λόγω μέθοδο. |Προηγούμενο: [[:java:exceptions_try_catch_block| Διαχείριση Εξαιρέσεων ]] | Επόμενο: [[:java:exceptions_throwing | Δημιουργία και πυροδότηση εξαίρεσης ]]|

java/exceptions_thrown_by_methods.1455534996.txt.gz · Last modified: 2016/02/26 11:15 (external edit)