This is indeed controversial:
http://stackoverflow.com/questions/3881/illegalargumentexception-or-nullpointerexception-for-a-null-parameter
You're right that we're stuck, for better or for worse, with the
decision that we've made.
(Note that it's not quite true that all other checkXXX methods throw
IAE: That's only true of checkArgument (and, in rare cases,
checkXXXIndex).)
A few small advantages to NPE:
1) Checking happens automatically in many cases, so there's less code to write.
2) A small number of APIs (notably AbstractMap.equals) requires that
certain operations thrown NPE and not IAE. This is a more important
rule to us than to the average developer because of the number of
collections we write.
3) If NullPointerTester accepted IAE, it would mask bugs when an IAE
is thrown for some other reason (since NPT doesn't necessarily know
what are valid values for the other parameters):
Foo(String s, Iterable it) {
checkArgument(s.length() > 0);
// fail to check that it isn't null
}