User Tools

Site Tools


java:exceptions_thrown_by_methods

This is an old revision of the document!


Χειρισμός της εξαίρεσης σε υψηλότερο επίπεδο

Στην προηγούμενη ενότητα δείξαμε πως μπορούμε να χειριστούμε μια εξαίρεση όταν προκύπτει. Η Java μας δίνει την δυνατότητα να μην διαχειριστούμε την εξαίρεση μέσα στην μέθοδο που δημιουργείται ή σε κάποια άλλη μέθοδο η οποία βρίσκεται πιο πάνω στην “ιεραρχία” των μεθόδων που έχουν ήδη κληθεί και βρίσκονται μέσα στην στοίβα εκτέλεσης του προγράμματος μας. Ας ξαναδούμε το προηγούμενο παράδειγμα ελαφρά παραλλαγμένο.

Ας υποθέσουμε ότι έχετε τις μεθόδους 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 που δημιουργήθηκε.

  1. Κατ' αρχήν διαχωρίζουμε το FileNotFoundException από το IOException σε δύο διαφορετικά try blocks.
  2. Στην συνέχεια κάνουμε comment-out τις γραμμές που ελέγχουν το FileNotFoundException και αντ' αυτού προσθέτουμε μία δήλωση throws FileNotFoundException στην δήλωση της μεθόδου.
  3. Τέλος διαχειριζόμαστε την εξαίρεση μέσα στη μέθοδο main.
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]);
    }
  }
 
}

Στον παραπάνω κώδικα βλέπουμε την περίπτωση στην οποία δεν διαχειριζόμαστε την εξαίρεση εντός της μεθόδου readFile αλλά αφήνουμε να περάσει η εξαίρεση στην μέθοδο που την καλεί (στην περίπτωση μας η μέθοδος public static void main(String args[])) και την διαχειριζόμαστε εκεί. Εφόσον δεν διαχειριζόμαστε το Exception στην δήλωση της μεθόδου, είναι υποχρεωτικό από τον μεταγλωττιστή της Java να προσθέσουμε την επιπλέον δήλωση

throws FileNotFoundException

όπου περιγράφεται ποια Exceptions μπορεί να μην διαχειριστεί μία μέθοδος και να αφήσει τη διαχείριση τους στις μεθόδους που την καλούν. Μία μέθοδος μπορεί να μην διαχειριστεί και να αφήσει προς διαχείριση στις μεθόδους που την καλούν περισσότερα του ενός Exceptions.

Η δήλωση throws υποχρεώνει τον compiler να βγάλει σφάλμα:

  • εάν δεν διαχειριστούμε τον συγκεκριμένο τύπο Exception στην μέθοδο από την οποία καλούμε την μέθοδο στην μέθοδο που παράγεται η εξαίρεση. Σε αυτή την περίπτωση, η διαχείριση του Exception θα γίνει στην μέθοδο που καλεί την μέθοδο που παράγει το Exception.
  • ή εάν δεν υπάρχει δήλωση throws για το συγκεκριμένο τύπο Exception στην δήλωση της μεθόδου από την οποία καλούμε την εν λόγω μέθοδο. Σε αυτή την περίπτωση, η διαχείριση του Exception θα γίνει σε παραπάνω επίπεδο από την μέθοδο που καλεί το Exception.
java/exceptions_thrown_by_methods.1486393186.txt.gz · Last modified: 2017/02/06 14:59 by gthanos