java:exceptions_try_with_resources

try-with-resources Block

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

WholeFileReader.java
import java.io.*;
import java.lang.*;
 
public class WholeFileReader {
 
  public String readFile(String path) {
 
    try ( FileReader fReader = new FileReader(new File (path)) ) {      
      BufferedReader in = new BufferedReader(fReader);
      String inputLine;
      StringBuffer strDocument = new StringBuffer();
      while ((inputLine = in.readLine()) != null) {
        strDocument.append(inputLine);
        //throw new IOException();
      }
      return strDocument.toString();
    }
    catch(IOException ex) {
      System.out.println("IOException occured while reading from file "+path);
    }
 
    return "";
  }
 
  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 from command line!\n");
    }
  }
 
}

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

    try ( FileReader fReader = new FileReader(new File (path)) ) { 
    }

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

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

try (
        java.util.zip.ZipFile zf =
             new java.util.zip.ZipFile(zipFileName);
        java.io.BufferedWriter writer = 
            java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
    ) {
java/exceptions_try_with_resources.txt · Last modified: 2017/02/16 15:09 by gthanos