java:exceptions_thrown_by_methods

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

java:exceptions_thrown_by_methods [2017/02/06 14:59]
gthanos
java:exceptions_thrown_by_methods [2021/03/23 07:33]
Line 1: Line 1:
-====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ====== 
  
-Στην προηγούμενη ενότητα δείξαμε πως μπορούμε να χειριστούμε μια εξαίρεση όταν προκύπτει. Η 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'' αλλά αφήνουμε να περάσει η εξαίρεση στην μέθοδο που την καλεί (στην περίπτωση μας η μέθοδος ''public static void main(String args[])'') και την διαχειριζόμαστε εκεί. Εφόσον δεν διαχειριζόμαστε το //Exception// στην δήλωση της μεθόδου, είναι υποχρεωτικό από τον μεταγλωττιστή της Java να προσθέσουμε την επιπλέον δήλωση  
- 
-<code java> 
-throws FileNotFoundException 
-</code> 
- 
-όπου περιγράφεται ποια //Exceptions// μπορεί να μην  διαχειριστεί μία μέθοδος και να αφήσει τη διαχείριση τους στις μεθόδους που την καλούν. Μία μέθοδος μπορεί να μην διαχειριστεί και να αφήσει προς διαχείριση στις μεθόδους που την καλούν περισσότερα του ενός Exceptions.  
- 
-Η δήλωση **throws** υποχρεώνει τον compiler να βγάλει σφάλμα: 
-  * εάν δεν διαχειριστούμε τον συγκεκριμένο τύπο //Exception// στην μέθοδο από την οποία καλούμε την μέθοδο στην μέθοδο που παράγεται η εξαίρεση. Σε αυτή την περίπτωση, η διαχείριση του Exception θα γίνει στην μέθοδο που καλεί την μέθοδο που παράγει το Exception. 
-  * ή εάν δεν υπάρχει δήλωση **throws** για το συγκεκριμένο τύπο Exception στην δήλωση της μεθόδου από την οποία καλούμε την εν λόγω μέθοδο. Σε αυτή την περίπτωση, η διαχείριση του Exception θα γίνει σε παραπάνω επίπεδο από την μέθοδο που καλεί το Exception. 
- 
-|Προηγούμενο: [[:java:exceptions_try_catch_block| Διαχείριση Εξαιρέσεων ]] | Επόμενο: [[:java:exceptions_throwing | Δημιουργία και πυροδότηση εξαίρεσης ]]| 
java/exceptions_thrown_by_methods.txt · Last modified: 2021/03/23 07:33 (external edit)