On 6 May 2014 22:54, Paul Benedict <pbened...@apache.org> wrote: > This is not a matter of law. If Oracle/Sun set a direction on how to use > NPE, it's a really good idea to follow them -- even if you don't agree, do > it for the sake of consistency. I don't think using IAE is somehow "better" > Java than what they are doing. And I give weight to what Joshua said > because he's a former architect of that company. Lang3 was designed to > throw NPE on invalid null arguments because that's what the gurus, like he, > in our industry who publish "best practices" say it should. If your opinion > bears greater weight than those set forth the best practices, then you win, > but I don't advocate going back to IAE for nulls for the reasons stated.
The problem is still that NPE can be thrown by the JVM for code bugs. If you Google/Bing for "what does NPE mean?" most of the postings say that this is due to a bug in the code that throws it rather than a bug in the code that calls it. There is nothing inherently wrong with using IAE for reporting a null argument. I think it was a mistake to suggest using NPE for that. One might as well throw ArithmeticException for a zero argument that is going to be used as a divisor. Neither is as helpful as IAE. The problem is that NPE is ambiguous. IAE is not. > > > > Cheers, > Paul > > > On Tue, May 6, 2014 at 4:40 PM, Duncan Jones <dun...@wortharead.com> wrote: > >> On 6 May 2014 22:27, "Michael Osipov" <1983-01...@gmx.net> wrote: >> > >> > Am 2014-05-06 15:27, schrieb Benedikt Ritter: >> > >> >> Hi Thiago, >> >> >> >> >> >> 2014-05-06 14:53 GMT+02:00 Thiago Andrade <thia...@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. >> >> Effective Java is a great book, but don't confuse Joshua's advice with law. >> >> > >> > 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? >> >> +1 to this. We should update all of lang to use Validate once we've nailed >> this issue. >> >> Duncan >> >> > >> > >> >>> 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-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