//: Cleanup.java
// Paying attention to exceptions
// in constructors
import java.io.*;
class InputFile {
    private BufferedReader in;
    InputFile(String fname) throws Exception {
        try {
            in =
                    new BufferedReader(
                            new FileReader(fname));
// Other code that might throw exceptions
        } catch(FileNotFoundException e) {
            System.out.println(
                    "Could not open " + fname);
// Wasn't open, so don't close it
            throw e;
        } catch(Exception e) {
// All other exceptions must close it
            try {
                in.close();
            } catch(IOException e2) {
                System.out.println(
                        "in.close() unsuccessful");
            }
            throw e;
        } finally {
            in.close();
// Don't close it here!!!
        }
    }
    String getLine() {
        String s;
        try {
            s = in.readLine();
        } catch(IOException e) {
            System.out.println(
                    "readLine() unsuccessful");
            s = "failed";
        }
        return s;
    }
    void cleanup() {
        try {
            in.close();
        } catch(IOException e2) {
            System.out.println(
                    "in.close() unsuccessful");
        }
    }
}
public class Cleanup {
    public static void main(String[] args) {
        try {
            InputFile in =
                    new InputFile("src\\Cleanup.java");
            String s;
            int i = 1;
            while((s = in.getLine()) != null)
                System.out.println(""+ i++ + ": " + s);
            in.cleanup();
        } catch(Exception e) {
            System.out.println(
                    "Caught in main, e.printStackTrace()");
            e.printStackTrace();
        }
    }
} ///:~

P.280“9 . 7 构建器”一节及以上例程“Cleanup.java”很值得多看看。