//: Cleanup.java // Paying attention to exceptions in constructor 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 exception must close it try { in.close(); } catch ( IOException e2 ) { System.out.println("in.close() unsuccessful"); } throw e; } finally { // 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("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(); } } }