为什么这段代码会抛出NullPointerException?

时间:2010-07-02 01:03:23

标签: java nullpointerexception

最终我得到了答案,但它让我困惑了一段时间。

为什么以下代码在运行时会抛出NullPointerException?

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
    }
}

2 个答案:

答案 0 :(得分:11)

当您尝试将null分配给int时,m.put会返回int p(表示没有“上一个”值)。将Integer p替换为null即可。

这在JLS 5.1.8中指定:

  

5.1.8 Unboxing Conversion

     

在运行时,取消装箱转换过程如下:

     
      
  • 如果 r NullPointerException,则取消装箱转化会引发 Integer p = m.put("oscar", a == null ? 1 : a++);
  •   

与问题无关,只考虑DRY的一个侧面建议,考虑写一下:

{{1}}

它更具可读性:)

答案 1 :(得分:5)

您要将int p分配给m.put()的返回值。但是put()在这种情况下会返回null,而您无法将int分配给null

来自HashMap.put()的Javadoc:

  

<强>返回:       与指定键关联的先前值,如果没有,则返回null   映射为密钥。