[jdom-interest] Re: NoSuch*Exception

Alex Chaffee guru at edamame.stinky.com
Wed Jul 5 01:08:06 PDT 2000


[Disclaimer: I'm a null-head at present, but open to the exceptional
point of view.]

For the record, I subscribe to Joe Bowbeer's position: "In a large
number of situations, the absence of an attribute or element is not an
exceptional circumstance, and JDOM's accessor methods are in no
position to arbitrate."

A question for the exception-heads:

What's the difference between

try {
  value = element.getChild("foo").getChild("bar").getContent();
}
catch (NoSuchElementException e) {
  ...
}

and 

try {
  value = element.getChild("foo").getChild("bar").getContent();
}
catch (NullPointerException e) {
  ...
}

?  The former appears slightly cleaner, but in practice it works out
the same.  Only difference is, we're not forced to catch a NPE by the
compiler.  This can be both good and bad, as others have argued.

If getChild() et al. returned null, then we could use either catch-NPE
or compare-to-null, depending on personal coding style.  If getChild()
throws an exception, we would be forced to use catch-style
programming, which is inadequate for certain cases, like this code I
just wrote last night:

    Element item = (Element) i.next();
    String title=null, url=null, date=null, location=null, description=null;
    
    try { title = item.getChild("title").getContent(); }
    catch (NoSuchElementException e) {}
    try { url = item.getChild("url").getContent(); }
    catch (NoSuchElementException e) {}
    try { date = item.getChild("date").getContent(); }
    catch (NoSuchElementException e) {}
    try { location = item.getChild("location").getContent(); }
    catch (NoSuchElementException e) {}
    try { description = item.getChild("description").getContent(); }
    catch (NoSuchElementException e) {}

It's really ugly catching and discarding countless exceptions in a row
like that.

If they returned null, I could do something like

Element child;
title = ((child = item.getChild("title")) == null ? null : child.getContent());
url = ((child = item.getChild("url")) == null ? null : child.getContent());
...

or just

title = item.getChildContent("url");

if that existed.

Furthermore, there needs to be a hasChild("foo") method to allow
pre-fetch testing, which is desirable in either the catch or compare
scenarii.  In fact, with hasChild(), even if we stayed in
exception-land, I could rewrite the above

try {
   if (item.hasChild("title"))
       title = item.getChild("title").getContent();   
   if (item.hasChild("url"))
       url = item.getChild("url").getContent();   
   if (item.hasChild("date"))
       date = item.getChild("date").getContent();
}
catch (NoSuchElementException e) {}

which is much cleaner than either of the others.  (It also points out
that I know for a fact that NSEE can be ignored here.)
    
 - Alex

P.S. I think I'm just waiting for XPath.  

P.P.S. Except I know XPath will have the same issues :-)

-- 
Alex Chaffee                       mailto:alex at jguru.com
jGuru - Java News and FAQs         http://www.jguru.com/alex/
Creator of Gamelan                 http://www.gamelan.com/
Founder of Purple Technology       http://www.purpletech.com/
Curator of Stinky Art Collective   http://www.stinky.com/



More information about the jdom-interest mailing list