Web architecture and framework

OCPJP Java 7 Mock Certification Exam: A Tricky Question about ARM and Try-with-Resources

By Sal Pece and Cameron McKenzie

TheServerSide.com

Take a quick look at the following piece of code, all of which would be compiled in a single file named TryWithResources.java. What is the final output when the code runs?

public class TryWithResources {
 
  public static void main(String[] args) throws Exception {
    try (OpenDoor door = new OpenDoor();
          OpenWindow window = new OpenWindow()  ) {
               door.swing();
               window.crank();
    }
    catch(Exception e) {System.out.println("Is there a draft?");}
    finally {System.out.println("I'm putting a sweater on, regardless.");}
  }
}
 
 
class OpenDoor implements AutoCloseable {
  public OpenDoor() { System.out.println("The door is open.");};
 
  public void swing() throws Exception {
       System.out.println("The door is becoming unhinged.");
       throw new Exception();
  }
 
  public void close() throws Exception {
    System.out.println("The door is closed.");
  }
}
 
 
class OpenWindow implements AutoCloseable {
  public OpenWindow() { System.out.println("The window is open.");};
  public void crank() throws Exception {
	System.out.println("The window is overcranked!");
	throw new Exception();
  }
 
  public void close() throws Exception{
    System.out.println("The window is closed.");
  }
}

Thinking through the logic, here is what happens: A door is opened and a window is opened, or at least, instances of the corresponding objects are created within the resource declaration section of the try block. 

    try (OpenDoor door = new OpenDoor();
     OpenWindow window = new OpenWindow() ) {

Then, the door is swung off it's hinge, and an exception is thrown. Because of the exception being thrown, the window never gets cranked. :(

  public void swing() throws Exception {
       System.out.println("The door is becoming unhinged.");
       throw new Exception();
  }

Before any exception handling code is executed, the resources opened in the resource declaration block are closed. This is a requirement of the automatic resource management (ARM) feature introduced in Java 7. However, this all happens implicitly, so we never actually see the call to the method close in our code.

Then, the exception handling occurs: first the catch block which handles the exception runs, and then the finally block, which always runs regardless of whether an exception is thrown in the body of the try block, is executed.

    catch(Exception e) {System.out.println("Is there a draft?");}
    finally {System.out.println("I'm putting a sweater on, regardless.");}

In the end, we see the following output:

C:\_jdk1.7\bin>java TryWithResources
The door is open.
The window is open.
The door is becoming unhinged.
The window is closed.
The door is closed.
Is there a draft?
I'm putting a sweater on, regardless.

 

 

Learning Resources for the Java and Java 7 Certification
 

OCP Java SE 6 Programmer Practice Exams (Exam 310-065) (Certification Press)
OCP Java SE 7 Programmer Study Guide (Certification Press)
SCJP Sun Certified Programmer for Java 6 Exam 310-065
A Programmer's Guide to Java SCJP Certification: A Comprehensive Primer (3rd Edition)
SCJA Sun Certified Java Associate Study Guide for Test CX-310-019, 2nd Edition

 

Check out these other tutorials from TheServerSide's Sal Pece and Cameron McKenzie covering the new Java 7 features:

New Java 7 Features: Binary Notation and Literal Variable Initialization
New Java 7 Features: Numeric Underscores with Literals Tutorial
New Java 7 Features: Using String in the Switch Statement Tutorial
New Java 7 Features: The Try-with-resources Language Enhancement Tutorial 
New Java 7 Features: Automatic Resource Management (ARM) and the AutoCloseable Interfact Tutorial
New Java 7 Features: Suppressed Exceptions and Try-with-resources Tutorial
Java 7 Mock Certification Exam: A Tricky OCPJP Question about ARM and Try-with-Resources
OCAJP Exam to Debuts in March 2010. OCPJP Released in June?
OCPJP & OCAJP Java 7 Exams: Oracle Drops the Training Requirement
OCAJP and OCPJP Changes for Java 7:  New Objectives, a Format Change and a Price Hike

 

30 Dec 2011

Related Content

Related Resources

Disclaimer: Our Tips Exchange is a forum for you to share technical advice and expertise with your peers and to learn from other enterprise IT professionals. TechTarget provides the infrastructure to facilitate this sharing of information. However, we cannot guarantee the accuracy or validity of the material submitted. You agree that your use of the Ask The Expert services and your reliance on any questions, answers, information or other materials received through this Web site is at your own risk.