java:exceptions_thrown_by_methods2

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

Στην προηγούμενη ενότητα δείξαμε πως μπορούμε να χειριστούμε μια εξαίρεση όταν προκύπτει. Η 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 που δημιουργήθηκε.

Πάνω στο προηγούμενο πρόγραμμα θα γράψουμε την εξής παραλλαγή. Αντί για το διάβασμα ενός αρχείου από την γραμμή εντολών θα έχουμε περισσότερα του ενός αρχεία. Δημιουργούμε την ενδιάμεση μέθοδο sumMultipleFileContents η οποία λαμβάνει ένα πίνακα από Strings, κάθε ένα εκ των οποίων αντιστοιχεί σε ένα όνομα αρχείου. Με τη βοήθεια της μεθόδου sumFileContents επιστρέφει το συνολικό άθροισμα των επιμέρους αρχείων.

Παρατηρήστε ότι η μέθοδος sumFileContents παράγει μία εξαίρεση τύπου FileNotFoundException την οποία δεν διαχειρίζεται αλλά προωθεί στη μέθοδο που την καλεί. Η προώθηση γίνεται μέσω της δήλωσης throws FileNotFoundException στο prototype της μεθόδου sumFileContents. Με τη σειρά της η μέθοδος sumMultipleFileContents κάνει το ίδιο προωθώντας το συγκεκριμένο exception στη μέθοδο main Η οποία τελικά το διαχειρίζεται.

ReadMultipleFiles.java
import java.io.*;
import java.util.*;
 
public class ReadMultipleFiles {
 
  public static double sumFileContents(String path) throws FileNotFoundException {
 
    Scanner sc=null;
 
    try {
      File file = new File (path);
      sc = new Scanner(file);
      double double1 = sc.nextDouble();
      double double2 = sc.nextDouble();      
      return double1 + double2;
    }
    catch(NoSuchElementException ex) {
      System.out.println("The specified type of element was not found!");
    }
    finally {
      System.out.println("Closing File!");
      sc.close();
    }
    return 0.0;
  }
 
  public static double sumMultipleFileContents(String []args) throws FileNotFoundException {
    double sum;
    sum = sumFileContents(args[0]);
    for(int i=1; i<args.length; i++)
      sum += sumFileContents(args[i]);
 
    return sum;
  }
 
  public static void main(String args[]) {
    try {
      double result = sumMultipleFileContents(args);
      System.out.println("Result is: "+result);
    }
    catch(IndexOutOfBoundsException ex) {
      System.out.println("No file has been specified from command line!\n");
    }
    catch(FileNotFoundException ex) {
      System.out.println("One of the specified files was not found!");
    }
  }
}
java/exceptions_thrown_by_methods2.txt · Last modified: 2019/04/20 05:04 by gthanos