Java 为什么这段代码抛出NullPointerException?
最终我得到了答案,但这让我困惑了一段时间 为什么以下代码在运行时抛出NullPointerExceptionJava 为什么这段代码抛出NullPointerException?,java,nullpointerexception,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>(
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
}
}
import java.util.*;
类WhyNullPointerException{
公共静态void main(字符串[]args){
//创建地图
Map m=新的HashMap();
//获取上一个值,显然为空。
整数a=m.get(“奥斯卡”);
//如果a为空,则将其置为1,否则增加a
int p=a==null?
m、 付诸表决(“奥斯卡”,1):
m、 put(“oscar”,a++);//Stacktrace在这一行中报告Npe
}
}
因为在您尝试将其分配给int
时返回null
(这表示没有“previous”值)。将int p
替换为Integer p
,它将正常工作
具体规定如下:
在运行时,取消装箱转换按如下方式进行:
- 如果r为
,取消装箱转换将抛出null
NullPointerException
<>与问题无关,只考虑一个侧面的建议,考虑写如下:
Integer p = m.put("oscar", a == null ? 1 : a++);
更具可读性:)您正在将
int p
赋值给m.put()的返回值。但是在这种情况下,put()
返回null
,并且不能将int
分配给null
从HashMap.put()的Javadocs中:
返回:
与指定键关联的上一个值,如果没有,则为null
键的映射
请注意,如果一段时间后没有人发布答案,那么回答您自己的问题是完全可以接受的。如果这是您的软件中的常见模式,您可以查看ApacheCommons DefaultedMap来修饰地图,使其自动返回1@我非常感谢你的链接。不,实际上我是在用Java7:P创建一篇关于闭包的博客文章,就是这样:(虽然用西班牙语)这与自动装箱有关系吗?@Johannes:确实有关系。整数被自动取消绑定到int中-如果整数恰好为null,则取消绑定将抛出。@Johannes:事实上,null
不能取消绑定到原语,它将抛出NPE。另请参见。实际上stacktrace是错误的,因为它使您认为问题出在a++
中,但请尝试用任何数字替换,例如put(“奥斯卡”),/*a++*/4
,Npe返回的行将改为put(“奥斯卡”,1)
。我不知道为什么它会在那行报告。