Another perspective to think about is whether you want to write code like:

try {
  // la-di-da
} catch (NullPointerException e) {
  // garbage in!
}

or:

try {
  // doo-wap-doo-wap
} catch (IllegalArugumentException e) {
  // garbage in!
}

Catching NPE just smells funny to me.

Gary



On Fri, Aug 30, 2013 at 1:06 PM, sebb <seb...@gmail.com> wrote:

> The fact that NPE is documented in Bloch is quite important.
>
> Whatever we do choose, we should make sure to document all th reasons
> (pros and cons) somewhere other than just the mailing list!
>
> On 30 August 2013 17:30, Matt Benson <gudnabr...@gmail.com> wrote:
> > The discussion for [lang], none of whose participants have weighed in
> here,
> > took place in late 2009 (so perhaps a little longer ago than I thought)
> and
> > is archived at [1].  IMO Paul B. makes some pretty compelling arguments
> in
> > [2].
> >
> > Matt
> >
> > [1] http://markmail.org/thread/7gw7xzrc3c3ul74c
> > [2] http://markmail.org/message/wmc4jh4pmhjjtxdf
> >
> >
> > On Fri, Aug 30, 2013 at 11:13 AM, sebb <seb...@gmail.com> wrote:
> >
> >> The JDK Javadoc says of NPE:
> >>
> >>  * Applications should throw instances of this class to indicate
> >>  * other illegal uses of the <code>null</code> object.
> >>
> >> and of IAE:
> >>
> >>  * Thrown to indicate that a method has been passed an illegal or
> >>  * inappropriate argument.
> >>
> >> That says to me that we should throw IAE here.
> >>
> >> The JDK does use NPE for parameter checks, but it also uses IAE, for
> >> example:
> >>
> >> javax.management.monitor.Monitor.addObservedObject
> >> java.rmi.activation.ActivationDesc.ActivationDesc
> >> javax.management.relation.RoleList.add
> >> javax.imageio.metadata.IIOMetadataFormatImpl.addAttribute
> >>
> >> On 30 August 2013 16:50, Adrian Crum <
> adrian.c...@sandglass-software.com>
> >> wrote:
> >> > I've seen a lot of discussions on NPE versus IAE, and in the end they
> all
> >> > condense down to what Matt stated here: Those who favor NPE cite the
> JDK
> >> > classes as a pattern to follow, and those who favor IAE say it is a
> >> better
> >> > description of the problem. From my perspective, both are valid
> >> viewpoints,
> >> > and a project simply needs to choose one. In the end, the choice is
> >> neither
> >> > "right" nor "wrong" - it is just a choice.
> >> >
> >> > -Adrian
> >> >
> >> >
> >> >
> >> > On 8/30/2013 8:07 AM, Matt Benson wrote:
> >> >>
> >> >> Let me stir the pot:
> >> >>    At a fundamental level I agree that a required *argument* should
> >> throw
> >> >> an
> >> >> IllegalArgumentException when null is supplied.  However, ISTR the
> >> >> decision
> >> >> to do otherwise in [lang] having been discussed on-list in the
> >> >> not-so-distant past, and the result of that discussion being that
> NPE is
> >> >> usually the result in the core JDK classes.  So I wouldn't
> characterize
> >> >> the
> >> >> situation as "[lang] *just happens* to throw NPE."  Now, [lang] is
> in a
> >> >> slightly unique situation as its stated mission is to complement Java
> >> SE,
> >> >> so it could be argued that [lang] is under greater pressure to
> conform
> >> for
> >> >> that reason.  But my personal preference, in light of the standing
> >> >> decision
> >> >> with [lang], would be for consistency throughout Commons components
> >> >> *despite* the fact that at a purely semantic level I agree with the
> >> >> arguments in favor of IllegalArgumentException.
> >> >>
> >> >> To summarize, +1 for NullPointerException from me.
> >> >>
> >> >> Matt
> >> >>
> >> >>
> >> >> On Fri, Aug 30, 2013 at 9:36 AM, Benedikt Ritter <brit...@apache.org
> >
> >> >> wrote:
> >> >>
> >> >>> 2013/8/30 sebb <seb...@gmail.com>
> >> >>>
> >> >>>> On 30 August 2013 15:19, Benedikt Ritter <brit...@apache.org>
> wrote:
> >> >>>>>
> >> >>>>> I've removed the generics in r1518974, thanks for spotting that
> sebb.
> >> >>>>>
> >> >>>>> Regarding the exception to throw I'm indifferent. The important
> thing
> >> >>>
> >> >>> is
> >> >>>>
> >> >>>> to
> >> >>>>>
> >> >>>>> fail early.
> >> >>>>>
> >> >>>> ... and with a helpful message.
> >> >>>>
> >> >>>>> I personally thing that NPE should be reserved for signaling that
> >> some
> >> >>>>
> >> >>>> code
> >> >>>>>
> >> >>>>> tried to invoke a method on a null reference.
> >> >>>>
> >> >>>> +1
> >> >>>>
> >> >>>>> In our case null is illegal because we know that some code later
> on
> >> >>>
> >> >>> would
> >> >>>>>
> >> >>>>> break if we accept a null reference. So IllegalStateException
> makes
> >> >>>>
> >> >>>> sense.
> >> >>>>
> >> >>>> s/IllegalStateException /IllegalArgumentException/
> >> >>>>
> >> >>>> +1
> >> >>>>
> >> >>> Sorry, I meant IAE of corse.
> >> >>>
> >> >>>
> >> >>>>> Imaging having a method that accepts an int and only positive ints
> >> are
> >> >>>>> valid. You would throw an IllegalArgumentException if a negative
> int
> >> is
> >> >>>>> passed to that method and not a NegativeIntegerException (or what
> >> >>>
> >> >>> ever).
> >> >>>>>
> >> >>>>> But James has a point. If [LANG] uses NPE maybe we should stick to
> >> >>>
> >> >>> this.
> >> >>>>
> >> >>>> I don't think we have to do the same as LANG, so long as the
> Javadoc
> >> is
> >> >>>> clear.
> >> >>>>
> >> >>>>> Feel free to change it. I'll leave it for now since there doesn't
> >> seem
> >> >>>
> >> >>> to
> >> >>>>>
> >> >>>>> be consensus?!
> >> >>>>
> >> >>>> Unless there are other reasons than "LANG happens to use NPE" I
> think
> >> >>>> we should stick with IAE, as it more clearly indicates the the
> problem
> >> >>>> is not within the method throwing it.
> >> >>>>
> >> >>>> The problem with using NPE to flag parameter errors is that it
> >> >>>> confuses the user as to the likely cause.
> >> >>>>
> >> >>>> Leave NPEs to the runtime system.
> >> >>>>
> >> >>> agreed.
> >> >>>
> >> >>>
> >> >>>>> Benedikt
> >> >>>>>
> >> >>>>>
> >> >>>>> 2013/8/30 James Carman <ja...@carmanconsulting.com>
> >> >>>>>
> >> >>>>>> Well, the problem with using NPE is that we as Java developers
> have
> >> >>>>>> learned through the years that NPE typically is an "oh crap"
> >> >>>>>> situation, where something is terribly wrong (we hate seeing
> those).
> >> >>>>>> Thus, our users may have knee-jerk reactions and not even know to
> >> >>>>>> inspect the message for the real cause.  IAE is less alarming,
> IMHO.
> >> >>>>>> Just my $0.02, but we've been doing it that way for a long time
> in
> >> >>>>>> [lang], so be it.
> >> >>>>>>
> >> >>>>>>
> >> >>>>>> On Fri, Aug 30, 2013 at 9:01 AM, sebb <seb...@gmail.com> wrote:
> >> >>>>>>>
> >> >>>>>>> AFAIK "accidental" NPEs don't have a message associated with
> them.
> >> >>>>>>>
> >> >>>>>>> So provided that the assertion generates the NPE with a suitable
> >> >>>>>>> message (e.g.as currently done for the IAE) then it *should* be
> >> >>>>>>> possible for the end user to distinguish the two cases.
> >> >>>>>>>
> >> >>>>>>> I am slightly in favour of retaining IAE as the cause is obvious
> >> >>>
> >> >>> with
> >> >>>>>>>
> >> >>>>>>> needing to look at the NPE message.
> >> >>>>>>>
> >> >>>>>>> ==
> >> >>>>>>>
> >> >>>>>>> Horrible hack: - if you want to use NPE, you could wrap an IAE
> in
> >> >>>
> >> >>> the
> >> >>>>>>
> >> >>>>>> NPE:
> >> >>>>>>>
> >> >>>>>>> npe = new NPE(msg);
> >> >>>>>>> npe.initCause(new IAE(msg));
> >> >>>>>>> throw npe;
> >> >>>>>>>
> >> >>>>>>> Or vice-vera, of course!
> >> >>>>>>>
> >> >>>>>>> Not sure that gains anything, but it does make the stack trace
> look
> >> >>>>>>> more impressive!
> >> >>>>>>>
> >> >>>>>>> On 30 August 2013 13:42, James Carman <
> ja...@carmanconsulting.com>
> >> >>>>>>
> >> >>>>>> wrote:
> >> >>>>>>>>
> >> >>>>>>>> Commons Lang's Validate.notNull() throws NPEs.  I don't know
> that
> >> >>>>
> >> >>>> I've
> >> >>>>>>>>
> >> >>>>>>>> necessarily agreed with that, but at some point a decision was
> >> made
> >> >>>>>>>> that null constraint violations should throw NPEs.  Food for
> >> >>>
> >> >>> thought.
> >> >>>>>>>>
> >> >>>>>>>> On Fri, Aug 30, 2013 at 8:32 AM, Gary Gregory <
> >> >>>>
> >> >>>> garydgreg...@gmail.com>
> >> >>>>>>
> >> >>>>>> wrote:
> >> >>>>>>>>>
> >> >>>>>>>>> On Fri, Aug 30, 2013 at 8:25 AM, Emmanuel Bourg <
> >> >>>
> >> >>> ebo...@apache.org>
> >> >>>>>>
> >> >>>>>> wrote:
> >> >>>>>>>>>>>>
> >> >>>>>>>>>>>> +        if (parameter == null) {
> >> >>>>>>>>>>>> +            throw new IllegalArgumentException("Parameter
> '"
> >> >>>
> >> >>> +
> >> >>>>>>>>>>
> >> >>>>>>>>>> parameterName + "' must not be null!");
> >> >>>>>>>>>>>>
> >> >>>>>>>>>>>> +        }
> >> >>>>>>>>>>>> +    }
> >> >>>>>>>>>>>> +}
> >> >>>>>>>>>>
> >> >>>>>>>>>> Isn't a null value supposed to throw a NPE ?
> >> >>>>>>>>>>
> >> >>>>>>>>> Not always IMO. When I see an NPE I assume something is very
> >> wrong
> >> >>>>
> >> >>>> and
> >> >>>>>>
> >> >>>>>> that
> >> >>>>>>>>>
> >> >>>>>>>>> it could be a bug in the impl OR a call site, somewhere on the
> >> >>>
> >> >>> code
> >> >>>>>>
> >> >>>>>> path.
> >> >>>>>>>>>
> >> >>>>>>>>> With an IAE, I know for sure it's a problem in the call site
> >> >>>
> >> >>> (which
> >> >>>>>>
> >> >>>>>> could
> >> >>>>>>>>>
> >> >>>>>>>>> be a bug of course).
> >> >>>>>>>>>
> >> >>>>>>>>> I does not help that the JRE/JDK is inconsistent, so it's
> hard to
> >> >>>>
> >> >>>> find
> >> >>>>>>>>>
> >> >>>>>>>>> examples.
> >> >>>>>>>>>
> >> >>>>>>>>> Gary
> >> >>>>>>>>>
> >> >>>>>>>>>
> >> >>>>>>>>>> Emmanuel Bourg
> >> >>>>>>>>>>
> >> >>>>>>>>>>
> >> >>>>>>>>>>
> >> >>>>
> ---------------------------------------------------------------------
> >> >>>>>>>>>>
> >> >>>>>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >> >>>>>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org
> >> >>>>>>>>>>
> >> >>>>>>>>>>
> >> >>>>>>>>>
> >> >>>>>>>>> --
> >> >>>>>>>>> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
> >> >>>>>>>>> Java Persistence with Hibernate, Second Edition<
> >> >>>>>>
> >> >>>>>> http://www.manning.com/bauer3/>
> >> >>>>>>>>>
> >> >>>>>>>>> JUnit in Action, Second Edition <
> >> http://www.manning.com/tahchiev/
> >> >>>>>>>>> Spring Batch in Action <http://www.manning.com/templier/>
> >> >>>>>>>>> Blog: http://garygregory.wordpress.com
> >> >>>>>>>>> Home: http://garygregory.com/
> >> >>>>>>>>> Tweet! http://twitter.com/GaryGregory
> >> >>>>>>>>
> >> >>>>>>>>
> >> >>>
> ---------------------------------------------------------------------
> >> >>>>>>>>
> >> >>>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >> >>>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org
> >> >>>>>>>>
> >> >>>>>>>
> >> >>>
> ---------------------------------------------------------------------
> >> >>>>>>>
> >> >>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >> >>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org
> >> >>>>>>>
> >> >>>>>>
> >> ---------------------------------------------------------------------
> >> >>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >> >>>>>> For additional commands, e-mail: dev-h...@commons.apache.org
> >> >>>>>>
> >> >>>>>>
> >> >>>>>
> >> >>>>> --
> >> >>>>> http://people.apache.org/~britter/
> >> >>>>> http://www.systemoutprintln.de/
> >> >>>>> http://twitter.com/BenediktRitter
> >> >>>>> http://github.com/britter
> >> >>>>
> >> >>>>
> ---------------------------------------------------------------------
> >> >>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >> >>>> For additional commands, e-mail: dev-h...@commons.apache.org
> >> >>>>
> >> >>>>
> >> >>>
> >> >>> --
> >> >>> http://people.apache.org/~britter/
> >> >>> http://www.systemoutprintln.de/
> >> >>> http://twitter.com/BenediktRitter
> >> >>> http://github.com/britter
> >> >>>
> >> >
> >> >
> >> > ---------------------------------------------------------------------
> >> > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >> > For additional commands, e-mail: dev-h...@commons.apache.org
> >> >
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >> For additional commands, e-mail: dev-h...@commons.apache.org
> >>
> >>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
>
>


-- 
E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
Java Persistence with Hibernate, Second Edition<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Reply via email to