====== try-with-resources Block ======
Ας επανέλθουμε στον αρχικό κώδικα που χρησιμοποιήσαμε για να διαβάσουμε ένα αρχείο. Εδώ θα παρουσιάσουμε μία παραλλαγή του κώδικα που παρουσιάστηκε νωρίτερα με χρήση ενός ιδιαίτερου **try** block.
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. Σε αυτό το τμήμα κώδικα η ιδιαιτερότητα είναι ότι δεν χρειάζεται να ανησυχούμε για το αν θα κλείσει σωστά το [[http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html|Scanner]] object ή όχι. Ανεξάρτητα από το αν θα δημιουργηθεί Exception ή όχι, το **JVM** θα αναλάβει να κλείσει το [[http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html|Scanner]] object αν αυτό παραμένει ανοιχτό. Απαραίτητη προϋπόθεση για να συμβεί το παραπάνω είναι η κλάση του αντικειμένου που θα δημιουργηθεί να υποστηρίζει το interface [[http://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html|java.lang.Autoclosable]] ή ένα από τα sub-interfaces αυτού (π.χ. [[http://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html|java.io.Closable]]).
Στην ίδια λογική μπορούμε να έχουμε περισσότερες από μία δηλώσεις κώδικα μέσα στην παρένθεση του try block όπως παρακάτω
try (
Scanner sc1 = new Scanner(new File(filename1));
Scanner sc2 = new Scanner(new File(filename2));
) {
|Προηγούμενο: [[:java:exceptions_throwing2 | Δημιουργία και πυροδότηση εξαιρέσεων]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[:java:exception_categories | Κατηγορίες Εξαιρέσεων ]]|