最终我得到了答案,但它让我困惑了一段时间。
为什么以下代码在运行时会抛出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
}
}
答案 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 映射为密钥。