    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
     <channel>
        <title>ACCU  :: More Exceptional Java</title>
        <link>https://members.accu.org/index.php/articles/399</link>
        <description>Professionalism in Programming</description>
        <dc:language>en-us</dc:language> 
        <dc:creator>Administrator</dc:creator> 
        <admin:generatorAgent rdf:resource="http://www.xaraya.org" /> 
        <admin:errorReportsTo rdf:resource="mailto:webeditor@accu.org" />
       <sy:updatePeriod>hourly</sy:updatePeriod>
       <sy:updateFrequency>1</sy:updateFrequency>
       <docs>http://backend.userland.com/rss</docs>




<div class="xar-mod-head"><span class="xar-mod-title">Programming Topics + Overload Journal #49 - Jun 2002</span></div>

<table border="0" cellpadding="1" cellspacing="0">
    <tbody>
    <tr>
        <td valign="top">
            Browse in :
       </td>
       <td valign="top">

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c13/">Topics</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c65/">Programming</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c76/">Journals</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c78/">Overload</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c196/">49</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/c65-196/">Any of these categories</a>

                    -                        <a href="https://members.accu.org/index.php/articles/c65+196/">All of these categories</a>
<br />
</td>
   </tr>
   </tbody>
</table>




<div class="xar-error">
   <p>
 <strong>Note:</strong> when you create a new publication type,
the articles module will automatically use the templates
<em>user-display-[publicationtype].xt</em>
and <em>user-summary-[publicationtype].xt</em>.
If those templates do not exist when you try to preview or display a new article,
you'll get this warning :-)  Please place your own templates in themes/<em>yourtheme</em>/modules/articles . The templates will get the extension .xt there. </p>
</div>
<div class="xar-norm xar-standard-box-padding">
   <h1><strong>Title:</strong>&nbsp;More Exceptional Java</h1>
<p><strong>Author:</strong>&nbsp;</p>
<p>
<strong>Date:</strong> 26 June 2002 17:46:10 +01:00 or Wed, 26 June 2002 17:46:10 +01:00</p>
<p><strong>Summary:</strong>&nbsp;</p>
<p><strong>Body:</strong>&nbsp;<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e18" id="d0e18"></a></h2>
</div>
<p>At the ACCU Spring conference last year I took my
exceptionsafety pattern language [<a href=
"#Griffiths40">Griffiths40</a>] and redrafted the discussion of C++
idioms in Java. This wasn't as simple as I had hoped, many of the
C++ techniques used have no equivalent in Java. The resulting
presentation met the goal of relating the pattern language to Java
and identified the necessary coding techniques. However, as Jon
Jagger commented, &quot;it lacks the same sense of resolution&quot; that the
C++ paper had.</p>
<p>The problem was that it raised a number of unanswered issues
regarding the use of Java exceptions. During the course of the
presentation these were discussed (with a lot of input from the
audience) without reaching a solution. The only clear conclusion I
could reach was that these were real problems that people were
experiencing.</p>
<p>A year has passed and now I have tried to address the issue of
how Java exceptions should be used in the companion article
&quot;Exceptional Java&quot; [<a href="#Griffiths48">Griffiths48</a>] and it
is time to returned to the original theme: that of writing
exception safe code.</p>
<p>These two articles can be read separately, but each raises
issues that are addressed by the other. One final point, although I
arrived at the ideas presented in &quot;More Exceptional Java&quot; a year
before writing &quot;Exceptional Java&quot; I would recommend reading it
second.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e34" id="d0e34"></a>A metaphorical
landscape: the heights of exception safety</h2>
</div>
<p>To give you some orientation in the exception-safety landscape I
will first describe the principle landmarks: the heights of
exception safety. These are the goals that we will be seeking
during the discussion of implementation techniques, so if you are
prone to asking, &quot;why are we doing this?&quot; it will be worth assuring
yourself that you understand them first.</p>
<p>Let us begin with a program in which an exception is thrown and
consider the call stack: a method <tt class="methodname">a</tt> has
called another method <tt class="methodname">b</tt>, <tt class=
"methodname">b</tt> has called <tt class="methodname">c</tt>, and
so on, until we reach <tt class="methodname">x</tt>; <tt class=
"methodname">x</tt> encounters a problem and throws an exception.
This exception causes the stack to unwind, executing the code in
<tt class="literal">finally</tt> (or <tt class=
"literal">catch</tt>) blocks, until the exception is caught and
handled by <tt class="methodname">a</tt>.</p>
<p>I'm sure that the author of <tt class="methodname">x</tt> has a
perfectly good reason for throwing an exception (running out of
memory, disk storage, or whatever) and that the author of
<tt class="methodname">a</tt> knows just what to do about it
(display: &quot;Sorry, please upgrade your computer and try
again!&quot;).</p>
<p>But exception safety is not about writing code that throws an
exception (method <tt class="methodname">x</tt>) nor about writing
code that handles it (method <tt class="methodname">a</tt>).</p>
<p>Exception safety is about writing the code that lies between -
writing all the intervening methods in a way that ensures that
something sensible happens when an exception propagates. It is
about writing the typical method m in the middle of the call stack.
If we want m to be &quot;exception safe&quot; then how should it behave?</p>
<p>Consider the options: If <tt class="methodname">m</tt> completes
its task by some other means (by using a different algorithm, or
returning a &quot;failed&quot; status code) then it would be handling the
exception. That isn't what we are concerned with - we are assuming
the exception won't be handled until we reach <tt class=
"methodname">a</tt>. Since <tt class="methodname">m</tt> doesn't
handle the exception we might reasonably expect that:</p>
<div class="orderedlist">
<ol type="1">
<li>
<p><tt class="methodname">m</tt> doesn't complete its task.</p>
</li>
<li>
<p>If <tt class="methodname">m</tt> has opened a file, acquired a
database connection, or, more generally; if <tt class=
"methodname">m</tt> has &quot;allocated a resource&quot; then the resource
should not leak. The file must be closed, the database connection
must be released, etc.</p>
</li>
<li>
<p>If <tt class="methodname">m</tt> changes a data structure, then
that structure should remain useable.</p>
</li>
</ol>
</div>
<p>In summary: if <tt class="methodname">m</tt> updates the system
state, then the state must remain usable. Note that isn't quite the
same as correct, for example, part of a name-and-address object may
have been changed leaving mismatched name and address values.</p>
<p>These conditions are called the <i class="firstterm">basic
exception safety guarantee</i>. Take a good look at it so that
you'll recognise it later.</p>
<p>If you are new to this territory then the basic exception safety
guarantee may seem daunting. But not only will we reach this in our
travels, we will be reaching an even higher peak called the
<i class="firstterm">strong exception safety guarantee</i> that
places a more demanding constraint on <tt class=
"methodname">m</tt>:</p>
<div class="orderedlist">
<ol start="4" type="1">
<li>
<p>If <tt class="methodname">m</tt> terminates by propagating an
exception then it has made no change to the state of the
program.</p>
</li>
</ol>
</div>
<p>The basic and strong exception safety guarantees were first
described by Dave Abrahams [<a href="#Abrahams">Abrahams</a>] to
document an implementation of the C++ standard library.</p>
<p>Note that it is impossible to implement m to deliver either the
basic or strong exception safety guarantees if the behaviour in the
presence of exceptions of the methods it calls isn't known. This is
particularly relevant when the client of m (that is l) supplies the
methods to be called either as callbacks or as implementations of
virtual member methods. In such cases the only recourse is to
document the constraints on them.</p>
<p>If we assume a design with fully encapsulated data then each
method need only be held directly responsible for aspects of the
object of which it is a member. For the rest, the code in each
method must rely on the methods it calls to behave as documented.
(We have to rely on documentation in this case, since in Java, as
in C++, there is no way to express these constraints in the
code.)</p>
<p>As we proceed we'll find frequent outcrops of the rock that
supports our mountains, which is named after the area in which it
is found and is called the <i class="firstterm">no-throw exception
safety guarantee</i>, as the name suggests this implies that the
corresponding function will never propagate an exception. Clearly
operations on the fundamental types provide this guarantee, as will
any sequence of no-throw operations. If it were not for the firm
footing that these outcrops of the no-throw exception safety
guarantee provide we would have great difficulty ascending the
heights. Although this was known and used in earlier work I think
it was first made explicit and named by Herb Sutter [<a href=
"#Sutter">Sutter</a>].</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e160" id="d0e160"></a>Do forgotten
objects live on?</h2>
</div>
<p>In Java objects are in a very real sense immortal - they do not
die - and are merely forgotten when there are no references to
them. This has a number of obvious advantages - in particular, one
cannot have a reference to an object that no longer exists (this is
a major element of the Java security model).</p>
<p>However, the basic and strong exception guarantees both refer to
&quot;the system state&quot; and it may not be obvious whether objects
awaiting garbage collection should be considered part of this.
These 'forgotten' objects cannot be accessed and I propose to
ignore them, they are not part of the system state.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e167" id="d0e167"></a>Java
exceptions</h2>
</div>
<p>Java has both checked and unchecked exceptions and the companion
article &quot;Exceptional Java&quot; examines the consequences of this. For
the purposes of this article I claim that both checked and
unchecked exceptions must be considered when reviewing code for
exception safety. A method that doesn't catch an exception doesn't
care about the type of the exception, particularly whether it is
checked or unchecked, so <tt class="literal">throws</tt> clauses
are of little account when reasoning about exception safety.</p>
<p>Why must unchecked exceptions be considered? Because they can be
thrown by <tt class="methodname">x</tt> and caught by <tt class=
"methodname">a</tt>. And the code that catches them requires
guarantees about the state of the system. If, for example, it is
going to restart the subsystem that encountered the problem, then
it needs to know that the subsystem died in an orderly manner.</p>
<p>Throughout this article whenever I mention exceptions without
qualification I mean it in the inclusive sense, &quot;either checked or
unchecked exception&quot;.</p>
<p>Not considering unchecked exceptions is a frequent cause of
errors. Two factors contributing to this are: a tendency for
developers to rely on the compiler to indicate any failure to
consider exceptions, and that error handling is often omitted from
demonstrative code - as it obscures the point. Consider the
following example (widely quoted as a way to avoid flicker when
using the AWT):</p>
<pre class="programlisting">
public void repaint() {
  Graphics g = getGraphics();
  paint(g);
  g.dispose();
}
</pre>
<p>It is possible for an unchecked exception to propagate from
<tt class="literal">paint(g)</tt>, which would bypass the
<tt class="literal">g.dispose()</tt> statement. It is important
that this doesn't happen in a real application as it releases
system resources. It is not sufficient to assume that the
<tt class="methodname">finalize</tt> method of the object formerly
known as <tt class="varname">g</tt> will release the resources as
there is no guarantee that the <tt class="methodname">finalize</tt>
method is called in a timely manner, or indeed ever.</p>
<p>In Java the only way to guarantee that a method on an object is
executed is to call it before the object is forgotten. In code
written for a production environment I'd expect to see:</p>
<pre class="programlisting">
public void repaint() {
  Graphics g = getGraphics();
  if (null != g) {
    try { paint(g); }
    finally { g.dispose(); }
  }
}
</pre>
<p>In this code fragment it should be obvious that the resources
will be released whether or not <tt class="methodname">paint()</tt>
propagates an exception - look at the three significant steps:
allocate, use, release and the logic that binds them together.</p>
<p>While on the subject of <tt class="literal">finally</tt>, please
use it idiomatically: while it is legal to exit from a <tt class=
"literal">finally</tt>-block using <tt class="literal">return</tt>,
<tt class="literal">continue</tt> or <tt class="literal">break</tt>
doing so defies the 'principle of least surprise'. The next
programmer to work on the code (it may be you) will expect that the
exception continues to propagate. If the exception may be handled
say so: by using <tt class="literal">catch</tt>!</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e235" id="d0e235"></a>Factoring out
'ALLOCATE-USE-RELEASE'</h2>
</div>
<p>While repeatedly reproducing the same code in slightly different
contexts may be good for productivity by metrics such as
lines-of-code it is tedious and a possible source of errors.
Wherever paired operations (such as allocation and release) need to
surround a piece of code it may be useful to employ the
EXECUTE-AROUND-METHOD idiom [<a href="#Henney">Henney</a>]. This
exists in a number of languages and in Java it is expressed by
passing an anonymous local class to a method that allocates the
resource, passes it to a method in the supplied code, and finally
release the resource:</p>
<pre class="programlisting">
public class ExecuteAroundMethod {
  private ListSelectionModel sel;
  private interface Adjustment {
    public void use(
      ListSelectionModel sel);
  }
  private void executeAround(
              Adjustment adjustment) {
    sel.setValueIsAdjusting(true);
// 'allocate'
    try {
      adjustment.use(sel);
// 'use'
    }
    finally {
      sel.setValueIsAdjusting(false);
// 'release'
    }
  }

  public void removeOdd() {
    executeAround(new Adjustment() {
      public void use(
        ListSelectionModel s) {
          for (int i = entries; -i != 0;)
            if (0 != i % 2)
              s.removeIndexInterval(i, i);
      }
    });
  }
}
</pre>
<p>There is a trade-off here, we've ensured that there is only one
method to examine to ensure that paired operations always occur
correctly, but we've paid a price by introducing extra classes and
method calls.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e247" id="d0e247"></a>Strong
exception safety guarantee - the frontal route</h2>
</div>
<p>We are now going to look at strongly exception safe version of a
simple method. The following example is a translation from C++ of
an example introduced as a test case by Tom Cargill. The method we
will examine, <tt class="methodname">copy()</tt>, is one that aims
to copy the state of <i class="parameter"><tt>source</tt></i> to
<tt class="varname">this</tt>:</p>
<pre class="programlisting">
public class Whole {
  private static class PartOne
              implements Cloneable {
    /* omitted */
  }
  private static class PartTwo
              implements Cloneable {
    /* omitted */
  }
  private PartOne p1;
  private PartTwo p2;
  public void copy(Whole source) {
    /* What goes here? */
  }
}
</pre>
<p>A (very na&iuml;ve) implementation might be:</p>
<pre class="programlisting">
public void copy(Whole source) {
  p1 = rhs.p1.clone();
  p2 = rhs.p2.clone();
}
</pre>
<p>Is this exception safe?</p>
<p>If we make the reasonable assumption that the <tt class=
"methodname">clone()</tt> methods are themselves strongly exception
safe then <tt class="methodname">copy()</tt> supports the basic
guarantee. (This is also the case if the <tt class=
"methodname">clone()</tt> methods support the basic guarantee.) If
the <tt class="methodname">clone()</tt> methods are not exception
safe there is little that <tt class="methodname">copy()</tt> can do
to achieve exception safety.</p>
<p>Only if the <tt class="literal">PartTwo.clone()</tt> method
called in the second line won't throw an exception can this version
of <tt class="methodname">copy()</tt> support the strong guarantee
(after modifying <tt class="varname">p1</tt> the system state has
definitely changed). Of course, the nothrow guarantee is an
unreasonable expectation of a <tt class="methodname">clone()</tt>
method, an 'out of memory' exception is a possibility for any
reasonable implementation. On the other hand there is nothing to
indicate that modifying <tt class="varname">p1</tt> alone will make
the object unusable so we can claim to meet the basic
guarantee.</p>
<p>Now consider a slightly updated version that addresses the
problem of an exception being thrown by the second <tt class=
"methodname">clone()</tt> call:</p>
<pre class="programlisting">
public void copy(Whole source) {
  PartOne temp = rhs.p1.clone();
  p2 = rhs.p2.clone();
  p1 = temp;
}
</pre>
<p>With the presumption that cloning does nothing that needs
reversing then an exception propagating from either of the first
two lines permits any changes to the system to be forgotten on exit
from <tt class="methodname">copy()</tt>. This is the strong
guarantee.</p>
<p>In the above we've assumed that cloning doesn't do anything that
needs to be undone. This isn't always true - for example <tt class=
"classname">PartOne</tt> and <tt class="classname">PartTwo</tt> may
own a resource that needs releasing. Adding the complexity of
ensuring <tt class="methodname">dispose()</tt> methods are called
and generalise slightly (I wouldn't normally expect to need the
checks against <tt class="literal">null</tt> for <tt class=
"methodname">clone()</tt> but other methods used in this context
might):</p>
<pre class="programlisting">
public void copy(Whole source) {
  PartOne t1 = rhs.p1.clone();
  if (null != t1) {
    try {
      PartTwo t2 = rhs.p2.clone();
      if (null != t2) {
        try {
          // examples of methods
          // that might throw
          t1.setParent(this);
          t2.setParent(this);

// ********************************
// This is the pivotal point of the
// code - everything that could
// fail is before this point.
// Nothing that makes persistent
// changes to the state of the
// system is before this point.
// ********************************

          // The following commits the
          // change to the system state.
          // Importantly it won't throw.
          PartOne swap1 = t1;
          t1 = p1;
          p1 = swap1;
          PartTwo swap2 = t2;
          t2 = p2;
          p2 = swap2;
        }
        finally {
          // either frees the original
          // resources or of the
          // temporary - depending
          // whether we passed the
          // pivot uneventfully.
          t2.dispose();
        }
      }
    }
    finally {
      // either frees the original
      // resources or of the temporary
      // - depending whether we
      // passed the pivot uneventfully.
      t1.dispose();
    }
  }
}
</pre>
<p>The code is structured in such a way that for each object
creation that succeed the <tt class="methodname">dispose()</tt>
method will be invoked. It will be invoked on either the original
instance if no exception is propagated or the replacement instance
in the case of an exception. The only assumptions needed to
demonstrate the strong guarantee being attained are: no exceptions
are propagated by the <tt class="methodname">dispose()</tt> calls
and that the <tt class="methodname">setParent()</tt> calls are
themselves exception safe.</p>
<p>This code structure once again shows the ALLOCATE-USERELEASE
idiom we observed earlier with a subtle variation, if no error
occurs then it's a different resource that is released. This has
been described before in a C++ context [<a href=
"#Henney21">Henney21</a>] and goes by the name
ALLOCATE-BEFORE-RELEASE. (Strictly, the original reference refers
to COPY-BEFORE-RELEASE, a special case equivalent to the current
example.)</p>
<p>A close examination of the above example should make it clear
that when committing updates to the system state we need operations
that don't throw exceptions. The assignments of references used to
swap the new state into the object are obviously safe - they are
guaranteed not to throw by the language, but if either call to
<tt class="methodname">dispose()</tt> were to throw an exception
then the strong guarantee would be violated.</p>
<p>This is an area in which Java standard library documentation is
deficient, as it only addresses checked exceptions. Consider the
method <tt class="methodname">Graphics.dispose()</tt> used in the
first example: could this propagate an unchecked 'null pointer'
exception? I hope not - but without documentation of this point we
don't know.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e360" id="d0e360"></a>A lower peak
- the basic guarantee</h2>
</div>
<p>On terrestrial mountains above a certain height there is a
&quot;death zone&quot; where the supply of oxygen is insufficient to support
life for long periods. Something similar happens with exception
safety: there is a cost to implementing the strong exception safety
guarantee. The technique illustrated above can involve the creation
of extensive duplicate data structure: the additional objects
created and the resources they allocate can be expensive in both
space and time. If repeated at all the levels of our call stack the
costs of doing this can suffocate an application.</p>
<p>The alternative to changing a copy of an object is to change the
original and either accept that an exception could leave a series
of changes incomplete. The result is that either the system will be
in an unknown state or we must be prepared to back out changes. For
either approach what we need to know is that nothing will go
horribly wrong, the basic exception safety guarantee.</p>
<p>To provide an example I'm going to elaborate on the previous
example by extending the class and adding a (potentially) large
container to the derived class:</p>
<pre class="programlisting">
public class BiggerWhole extends Whole {
  private Properties parameters
                     = new Properties();
  public void copy(BiggerWhole source) {
    /* What goes here? */
  }
}
</pre>
<p>Using the techniques we examined earlier we would take a clone
of <tt class="varname">source.parameters</tt> then call <tt class=
"methodname">super.copy()</tt>, and finally update parameters. If
we decide that the cost of creating a copy of parameters is
unacceptable then we can update it with the understanding that if
an exception occurs then we make no promise to the client code of
the exact state of <tt class="classname">BiggerWhole</tt>, the
client code must take appropriate action. Vis:</p>
<pre class="programlisting">
public void copy(BiggerWhole source) {
  super.copy(source);
  parameters.clear();
  Enumeration e =
       source.parameters.propertyNames();
  while (e.hasMoreElements())
  {
    String key = (String)e.nextElement();
    parameters.put(key,
    source.parameters.getProperty(key));
  }
}
</pre>
<p>At any point after <tt class="methodname">super.copy()</tt>
returns then the state of the system has changed. However an
exception is still possible. However, if failing to update
<tt class="varname">parameters</tt> completely leaves the object in
a sensible state then this may be acceptable.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e392" id=
"d0e392"></a>Conclusion</h2>
</div>
<p>The exception safety landmarks are useful in Java, as they are
in C++. The basic, strong and nothrow guarantees clearly make sense
and can be applied when writing or reviewing code. There are
techniques for writing code to these guarantees and these have been
demonstrated. While I must agree with those C++ developers who
consider these techniques less elegant than those available in C++
I see the principal issue to be the failure of a significant part
of the Java community to believe that the problem they solve
exists.</p>
<p>Ignoring a problem does not make it go away and as unchecked
exceptions can encapsulate rare but plausible events (e.g. out of
memory) and even exceptions explicitly thrown by the programmer it
is unreasonable to ignore them. It is unfortunate that they also
include that shouldn't happen in a correct program.</p>
<p>The path that led Java to the current handling of unchecked
exceptions is paved with good intentions: rather than the JVM
having undefined behaviour when &quot;bad things&quot; happen the behaviour
is defined. But this has only shifted the problem, because the
programmer is not working with the raw JVM, but with library code
that doesn't fully document its behaviour.</p>
<p>In addition to unchecked exceptions being undocumented, there
are no compile-time tools for verifying exception safety. This once
again leaves the problem with the developers, who must document and
check the requirements for themselves.</p>
<div class="bibliography">
<div class="titlepage">
<h2><a name="d0e403" id="d0e403"></a>References</h2>
</div>
<div class="bibliomixed"><a name="Griffiths40" id=
"Griffiths40"></a>
<p class="bibliomixed">[Griffiths40] Alan Griffiths, &quot;Here be
Dragons&quot;, <span class="citetitle"><i class="citetitle">Overload
40</i></span></p>
</div>
<div class="bibliomixed"><a name="Griffiths48" id=
"Griffiths48"></a>
<p class="bibliomixed">[Griffiths48] Alan Griffiths, &quot;Exceptional
Java&quot;, <span class="citetitle"><i class="citetitle">Overload
48</i></span></p>
</div>
<div class="bibliomixed"><a name="Abrahams" id="Abrahams"></a>
<p class="bibliomixed">[Abrahams] Dave Abrahams, <span class=
"citetitle"><i class="citetitle">Exception Safety in
STLPort</i></span>, <span class="bibliomisc"><a href=
"http://www.stlport.org/doc/exception_safety.html" target=
"_top">http://www.stlport.org/doc/exception_safety.html</a></span></p>
</div>
<div class="bibliomixed"><a name="Sutter" id="Sutter"></a>
<p class="bibliomixed">[Sutter] Herb Sutter, <span class=
"citetitle"><i class="citetitle">Exceptional C++</i></span>,
Addison-Wesley, ISBN 0-201-61562-2</p>
</div>
<div class="bibliomixed"><a name="Henney21" id="Henney21"></a>
<p class="bibliomixed">[Henney21] Kevlin Henney, &quot;Self Assignment?
No Problem!&quot;, <span class="citetitle"><i class="citetitle">Overload
21</i></span></p>
</div>
<div class="bibliomixed"><a name="Henney" id="Henney"></a>
<p class="bibliomixed">[Henney] Kevlin Henney, <span class=
"citetitle"><i class="citetitle">Java Patterns and
Implementations</i></span>, <span class="bibliomisc"><a href=
"http://homepages.tesco.net/~jophran/UKPatterns/plunk1/JavaPatterns.html"
target=
"_top">http://homepages.tesco.net/~jophran/UKPatterns/plunk1/JavaPatterns.html</a></span></p>
</div>
</div>
</div>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
