Eventually I got the answer, but it puzzled me for a while.
Why does the following code throws NullPointerException when run?
import java.util.*;
class WhyNullPointerException {
    public static void main( String [] args ){
       // Create a map
        Map<String,Integer> m = new HashMap<String,Integer>();
        // Get the previous value, obviously null.
        Integer a = m.get( "oscar" );
        // If a is null put 1, else increase a
        int p = a == null ? 
            m.put( "oscar", 1) : 
            m.put( "oscar", a++ ); // Stacktrace reports Npe in this line
    }
}
                NullPointerException is thrown when a reference variable is accessed (or de-referenced) and is not pointing to any object. This error can be resolved by using a try-catch block or an if-else condition to check if a reference variable is null before dereferencing it.
NullPointerException s are exceptions that occur when you try to use a reference that points to no location in memory (null) as though it were referencing an object. Calling a method on a null reference or trying to access a field of a null reference will trigger a NullPointerException .
The java. lang. NullPointerException is thrown in Java when you point to an object with a null value. Java programmers usually encounter this infamous pointer exception when they forget to initialize a variable (because null is the default value for uninitialized reference variables).
Because m.put returns null (which indicates that there's no "previous" value) while you're trying to assign it to int. Replace int p by Integer p and it will work.
This is specified in JLS 5.1.8:
5.1.8 Unboxing Conversion
At run time, unboxing conversion proceeds as follows:
- If r is
 null, unboxing conversion throws aNullPointerException
Unrelated to the problem, just a side suggestion with DRY in mind, consider writing it so:
    Integer p = m.put("oscar", a == null ? 1 : a++);
It's a bit more readable :)
You are assigning int p to the return value of m.put().  But put() returns null in this situation, and you can't assign an int to null.
From the Javadocs for HashMap.put():
Returns: previous value associated with specified key, or null if there was no mapping for key.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With