Constructor exceptions

Here’s a real noodle scratcher when you first encounter it. This makes a good interview question since it forces candidates to talk through the construction sequence. This isn’t a question that I would necessarily expect someone to answer correctly but I would expect someone to be able to talk through the various cases and the effects of those cases.

/**
* <p>Tests that refernces can be made to an member even though its constructor
* fails.</p>
*/
public class ConstructorExceptionTest extends TestCase
{
/**
* <p>Tests that refernces can be made to an member even though its
* constructor fails.</p>
*/
public void testException()
{
final ArrayList<ConstructorException> objects = new ArrayList<ConstructorException>();
ConstructorException failedObject = null;
try
{
failedObject = new ConstructorException(objects);
} catch(final Exception e)
{
// ignore since it is required to occur
}
assertNull("The newly created member should be null.", failedObject);
assertTrue("The list should not be empty.", !objects.isEmpty());
final ConstructorException listObject = objects.get(0);
assertNotNull("References to the object still exist.", listObject);
assertNull("The object's member should be null.", listObject.member);
}
/**
* <p>An member that throws an exception on construction to ascertain what
* ooccurs to references to it that are made before the construction
* completes.</p>
*/
private class ConstructorException
{
/**
* <p>Some member that is "created" after the constructor should have
* failed.</p>
*/
final Object member;
/**
* <p>Adds itself to the specified list of objects before it throws an
* exception.</p>
*
* @param  objects a list of objects to which this member adds itself
* @throws Exception always
*/
public ConstructorException(final List<ConstructorException> objects)
throws Exception
{
objects.add(this);
if(true)
throw new Exception();
/* else -- cannot occur */
member = new Object();
}
}
}

I should point out to all of you doubting Thomas’ out there that this test runs green. I should also point out that the if(true) is a trivial replacement for anything that can go wrong during construction.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s