Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这段代码抛出NullPointerException?_Java_Nullpointerexception - Fatal编程技术网

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

Java 为什么这段代码抛出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>(

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

为什么以下代码在运行时抛出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
    }
}
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)
。我不知道为什么它会在那行报告。