User Tools

Site Tools


java:exceptions_thrown_by_methods

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:exceptions_thrown_by_methods [2015/03/03 08:11] gthanosjava:exceptions_thrown_by_methods [2021/03/23 07:33] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ====== ====== Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο ======
  
-Στην προηγούμενη ενότητα δείξαμε πως μπορούμε να χειριστούμε μια εξαίρεση όταν προκύπτει. Η Java μας δίνει την δυνατότητα να μην διαχειριστούμε την εξαίρεση μέσα στην μέθοδο που προκύπτει, αλλά να σε κάποια άλλη μέθοδο πιο πάνω που καλεί την μέθοδο που προκύπτει. Ας ξαναδούμε το προηγούμενο παράδειγμα ελαφρά παραλλαγμένο. +Ας υποθέσουμε τώρα ότι θέλουμε να επαναλάβουμε την λειτουργικότητα του προηγούμενου προγράμματος εντός της νέας μεθόδου getRatio που καλείται από τη main, αλλά η διαχείριση της εξαίρεσης να εξακολουθεί γίνεται στη μέθοδο main.
  
-  - Κατ' αρχήν διαχωρίζουμε το ''FileNotFoundException'' από to ''IOException'' σε δύο διαφορετικά try blocks+<code java ExceptionHandling.java> 
-  - Στην συνέχεια κάνουμε comment-out τις γραμμές που ελέγχουν το ''FileNotFoundException'' και αντ' αυτού προσθέτουμε μία δήλωση ''throws FileNotFoundException'' στην δήλωση της μεθόδου+import java.util.Scanner; 
-  - Τέλος διαχειριζόμαστε την εξαίρεση μέσα στη μέθοδο ''main''.+import java.util.NoSuchElementException; 
 +import java.util.InputMismatchException;
  
-<code java>+public class ExceptionHandling { 
 +   
 +  public static double getRatio(Scanner sc) throws NoSuchElementException { 
 +    System.out.print("Width: "); 
 +    int width = sc.nextInt(); 
 +    System.out.print("Height: "); 
 +    int height = sc.nextInt(); 
 +    return width / (double)height; 
 +  } 
 +  public static void main(String []args) { 
 +    try (Scanner sc = new java.util.Scanner(System.in)){ 
 +      double ratio = getRatio(sc); 
 +      System.out.format("Ratio: %.2f", ratio); 
 +    } catch(InputMismatchException ex) { 
 +      System.out.println("Input doen not match integer value."); 
 +    } catch(NoSuchElementException ex) { 
 +      System.out.println("You have closed the input from command line."); 
 +    } 
 +  } 
 +
 +</code>
  
-import java.io.*; +Στον παραπάνω κώδικα παρατηρούμε ότι η μέθοδος getRatio μπορεί να παράγει μία εξαίρεση, αλλά η διαχείριση της γίνεται από τη μέθοδο που την καλεί, δηλαδή τη μέθοδο main. Η μέθοδος getRatio δεν περιέχει try/catch block, είμαστε όμως υποχρεωμένοι να δηλώσουμε σε αυτή ότι παράγει ένα exception του τύπου [[https://docs.oracle.com/javase/7/docs/api/java/util/NoSuchElementException.html|NoSuchElementException]] (ο τύπος εμπεριέχει όλες τις απογόνους κλάσεις όπως την κλάση [[https://docs.oracle.com/javase/7/docs/api/java/util/InputMismatchException.html|InputMismatchException]]).
-import java.lang.*;+
  
-public class WholeFileReader {+====== Stack Unwinding ====== 
 + 
 +Κατά την πυροδότηση μίας εξαίρεσης το πρόγραμμα διακόπτεται στο σημείο που συμβαίνει η εξαίρεση και συνεχίζει την εκτέλεση του στο πρώτο catch block, το οποίο ταιριάζει με τον τύπο της εξαίρεσης. Το stack της διεργασίας αναδιπλώνεται αυτόματα μέχρι το σημείο που θα βρεθεί το κατάλληλο catch block. Καμία από τις συναρτήσεις που εμπλέκονται δεν τερματίζει ομαλά μέχρι να φτάσουμε στο catch block. Δείτε το παρακάτω παράδειγμα, στο οποίο η πιθανή εξαίρεση παράγεται μέσα στη μέθοδο readInt. 
 + 
 +<code java ExceptionHandling.java> 
 +import java.util.Scanner; 
 +import java.util.NoSuchElementException; 
 +import java.util.InputMismatchException; 
 + 
 +public class ExceptionHandling {
      
-  public String readFile(String path) throws FileNotFoundException +  public static int readInt(Scanner sc) throws NoSuchElementException 
-    FileReader fReader = null;+    return sc.nextInt(); 
 +  }
      
-    try { +  public static double getRatio(Scanner scthrows NoSuchElementException 
-      File file = new File (path)+    System.out.print("Width: "); 
-      fReader = new FileReader(file); +    int width = readInt(sc); 
-      BufferedReader in = new BufferedReader(fReader); +    System.out.print("Height: "); 
-      String inputLine; +    int height readInt(sc); 
-      StringBuffer strDocument = new StringBuffer(); +    return width / (double)height;
-      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[]) { +  public static void main(String []args) { 
-    WholeFileReader wfr = new WholeFileReader(); +    double ratio = -1.0; 
-    try +    try (Scanner sc = new java.util.Scanner(System.in)){ 
-      System.out.println(wfr.readFile(args[0]) );+      ratio = getRatio(sc); 
 +      System.out.format("Ratio: %.2f", ratio); 
 +    } catch(InputMismatchException ex) 
 +      System.out.println("Input doen not match integer value."); 
 +    } catch(NoSuchElementException ex
 +      System.out.println("You have closed the input from command line.");
     }     }
-    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>
  
-Στον παραπάνω κώδικα βλέπουμε την περίπτωση στην οποία __δεν__ διαχειριζόμαστε την εξαίρεση εντός της μεθόδου ''readFile'' αλλά αφήνουμε να περνάμε την εξαίρεση στην μέθοδο που την καλεί (στην περίπτωση μας η ''main'') και την διαχειριζόμαστε εκεί. Eφόσον δεν διαχειριζόμαστε το Exception στην δήλωση της μεθόδου υπάρχει η επιπλέον δήλωση ''throws FileNotFoundException'', όπου περιγράφεται ποια Exceptions μπορεί να "πετάξει" η κάθε μέθοδος στις μεθόδους που την καλούν. Μία μέθοδος μπορεί να κάνει **throw** περισσότερα του ενός Exceptions. Η δήλωση throw υποχρεώνει τον compiler να βγάλει σφάλμα +Στο παραπάνω παράδειγμαόταν θα συμβεί μία εξαίρεση στη μέθοδο readInt, ο κώδικας σταματήσει την εκτέλεση του και καμία από τις συναρτήσεις που έχουν κληθεί ενδιάμεσα (getRatio, readInt) δεν θα επιστρέψει ομαλά. Αυτό που θα συμβεί είναι ότι ο κώδικας θα συνεχίσει να εκτελείται στο κατάλληλο catch block, που βρίσκεται στη μέθοδο main. Αφού συμβεί το exception, η μεταβλητή ratio έχει την τιμή -1.0 με την οποία αρχικοποιήθηκε.  
-  * εάν δεν διαχειριστούμε τον συγκεκριμένο τύπο Exception στην μέθοδο από την οποία καλούμε την μέθοδο με την δήλωση **throw**+ 
-  * ή εάν δεν έχουμε μία δήλωση **throw** για το συγκεκριμένο τύπο Exception στην δήλωση της μεθόδου από την οποία καλούμε την εν λόγω μέθοδο.+|Προηγούμενο: [[:java:exceptions_try_catch_block| Διαχείριση Εξαιρέσεων ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[:java:exceptions_throwing | Δημιουργία νέων τύπων εξαιρέσεων και πυροδότηση εξαιρέσεων ]]|
  
-|Προηγούμενο: [[:java:exceptions_try_catch_block| Διαχείριση Εξαιρέσεων ]] | Επόμενο: [[:java:exceptions_throwing | Δημιουργία και πυροδότηση εξαίρεσης ]]| 
java/exceptions_thrown_by_methods.1425370314.txt.gz · Last modified: 2015/03/03 08:11 by gthanos