java:exceptions_try_with_resources2

try-with-resources Block

Ας επανέλθουμε στον αρχικό κώδικα που χρησιμοποιήσαμε για να διαβάσουμε ένα αρχείο. Εδώ θα παρουσιάσουμε μία παραλλαγή του κώδικα που παρουσιάστηκε νωρίτερα με χρήση ενός ιδιαίτερου try block.

TryWithResources.java
import java.io.*;
import java.util.*;
 
public class TryWithResources {
 
  public static double addFileContents(String path) {
 
    File file = new File (path);
    try(Scanner sc = new Scanner(file)) {
      double sum = 0.0;
      while(sc.hasNextDouble()) {
        double value = sc.nextDouble();
        sum += sc.nextDouble();
      }
    }
    catch(FileNotFoundException ex) {
      System.out.println("The specified file was not found at "+ path);
    }
    catch(NoSuchElementException ex) {
      System.out.println("The specified type of element was not found!");
    }
 
    return 0.0;
  }
 
  public static void main(String args[]) {
    try {
      double result = addFileContents(args[0]);
      System.out.println("Result is: "+result);
    }
    catch(IndexOutOfBoundsException ex) {
      System.out.println("No file has been specified from command line!\n");
    }
  }
 
}

Από τον παραπάνω κώδικα ξεχωρίζει η δήλωση της μορφής

    try (Scanner sc = new Scanner(file)) ) { 
    }

όπου ανοίγουμε ένα resource πριν εισέλθουμε στο σώμα του try block. Σε αυτό το τμήμα κώδικα η ιδιαιτερότητα είναι ότι δεν χρειάζεται να ανησυχούμε για το αν θα κλείσει σωστά το Scanner object ή όχι. Ανεξάρτητα από το αν θα δημιουργηθεί Exception ή όχι, το JVM θα αναλάβει να κλείσει το Scanner object αν αυτό παραμένει ανοιχτό. Απαραίτητη προϋπόθεση για να συμβεί το παραπάνω είναι η κλάση του αντικειμένου που θα δημιουργηθεί να υποστηρίζει το interface java.lang.Autoclosable ή ένα από τα sub-interfaces αυτού (π.χ. java.io.Closable).

Στην ίδια λογική μπορούμε να έχουμε περισσότερες από μία δηλώσεις κώδικα μέσα στην παρένθεση του try block όπως παρακάτω

try (
        Scanner sc1 = new Scanner(new File(filename1));
        Scanner sc2 = new Scanner(new File(filename2));
    ) {
java/exceptions_try_with_resources2.txt · Last modified: 2019/04/20 05:05 by gthanos