I recently ran across a subtle way a handy Java 1.5 feature can sneak up and cause issues. Perhaps if I had spent more time pouring over the specs & documentation, it would've been very obvious, but alas, it definitely caught me by surprise. The problem was a null Pointer Exception (NPE) which I tracked down to the following line of code:
int id = map.get(key)
The obvious culprit was that HashMap named map was null, but as I stepped through the code, I found to my surprise that it wasn't. Neither was key, for that matter. So how the hell was I getting an NPE? Take a look at the declaration of map:
Map
Note how the values in map are Integer objects, but I'm setting the result of the get call to a primitive int. In Java 1.5, this is allowed as Java will automatically unbox the Integer into an int. But what happens if the value returned by get is null? Well, the auto unboxing can't convert that to any int value - returning some default value like 0 or -1 would be very deceiving - so you get a big old NPE.
Moral of the story: auto boxing and unboxing are very handy features to keep your code clean and readable, but keep NPE's in mind every time you use them.