commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael-O <1983-01...@gmx.net>
Subject Re: Re: [lang]
Date Tue, 06 May 2014 20:36:17 GMT
Am 2014-05-06 15:27, schrieb Benedikt Ritter:
> Hi Thiago,
>
>
> 2014-05-06 14:53 GMT+02:00 Thiago Andrade <thiagoh@gmail.com>:
>
>> Hello people,
>>
>> Analizing the JIRA issue https://issues.apache.org/jira/browse/LANG-1008the
>> contributors noticed that NumberUtils.max/min methods all have the same
>> problem:
>> They all throw an IllegalArgumentException when according to the official
>> documentation (Oracle|Sun) says that a NullPointerException must be thrown
>> when an argument must not be null.
>>
>
> This is not a problem imho. It is a question of API design. I don't now an
> offical documentation that say when IAE or NPE _must_ be thrown. Sun/Oracle
> at some point decided to throw NPE when ever a null reference is passed to
> a method that doesn't accept null inputs. I don't feel this is right, since
> a null input is also an illegal argument. Why make a differenciation? IMHO
> NPE should be reserved to the JVM, when a method is called on a null
> reference, but that's just my opinion.

It *is* a problem because NullPointerException and 
IllegalArgumentException have concrete semantics layed out in the JDK's 
Javadocs. If you see how both are used in the JDK, you see that NPE and 
IAE are used properly and there is no such restriction to the JDK only. 
If you aread Effective Java, you'll see that you *have to* use NPE if a 
null argument is passed. One might remember the NullArgumentException 
back in Lang 2, it was removed because it is imperative to use NPE instead.

Moreover, the Lang 3 package includes a great class, Validate, which 
does things right and now I can ask, why the hell is that not used 
throughout the entire library?

>> However according to Apache Commons Lang Developer Guide, these methods are
>> all correct. This guide says that "When throwing an exception to indicate a
>> bad argument, always try to throw IllegalArgumentException, even if the
>> argument was null. Do not throw NullPointerException.".

Correct to the dev guide only -- not Java.

> Since [lang] is currently designed this way, I'd rather deal with this
> issue for 4.0. We can then revisit our initial decision to only throw IAE
> an maybe align it to what the JDK now does. If you want to file an issue,
> my opinion is, that it should be fix version 4.0. Changing the exceptions
> that are thrown now may break clients (although I think there are very few
> use cases where one should catch IAE or NPE).

4.0 has to use Validate throughout the entire package. NPE and IAE 
indicate a programming error in the client not adhering to the contract 
depicted by the Javadocs, so it is the client's problem to deal with 
them. With proper programming, you should not have to catch those 
exception at all.

>> This mail was sent in order to discuss around and make decisions to solve
>> this dilemma where the Java official specification says X and the Apache
>> official specification says Y.
>>
>
> Can you please provide a lnk to the official specification you're refering
> to? ;-)

Read Effective Java on exceptions. Thiago provided a URL in the JIRA issue.

Further good resources:

1. 
http://docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html
2. 
http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html: "One 
case where it is common practice to throw a RuntimeException is when the 
user calls a method incorrectly. For example, a method can check if one 
of its arguments is incorrectly null. If an argument is null, the method 
might throw a NullPointerException, which is an unchecked exception."

Michael


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Mime
View raw message