关于Map不为空,put时却报java.lang.NullPointerException空指针异常的问题!

先总结,再描述:

一、问题总结

度娘问了一圈,找到以下总结:

1、小学生总结:
  • map没有new啊,没有分配内存!

    Map<String, Long> map = null;
    map.put("money", 1000000L);
    
  • map的key键值为空(比如TreeMap)

    TreeMap<String, Long> map = new TreeMap<String, Long>();
    map.put(null, 100L);
    
2、进阶总结:
  • Java自动拆装箱(即Long转long)
    public static void main(String[] args) {
    	Map<String, Long> map = new HashMap<String, Long>();
    	Long oldVal1 = map.put("money", 100L);
    	System.out.println("正确写法Long :\t" + oldVal1 );
    	long oldVal2 = map.put("age", 50L);
    	System.out.println("错误写法long :\t" + oldVal2 );
    }	
    
    正确写法:	null
    Exception in thread "main" java.lang.NullPointerException
    	at com.xxxx.service.Xxxxxx.main(Xxxxxx.java:48)
    

二、问题发生

  • 写了一个追加得分的map
  • 在赋值的时候,要用到map里的旧得分
  • 即直接使用了long oldVal = map.put("张三", 60L);
  • 此时的put,和get一样,如果key值不存在,返回值是null;
  • 而如果使用long去接收null,那肯定有问题,即抛空指针异常!

三、问题同理分析(可跳过)

有个案例,get抛异常的,根据异常信息,是 long value = map.get(2L); 时抛出了空指针异常。
分析过程如下:

1,自己首先想到的是map是否为空。因为map是new出来的,所以不可能为null。

2,然后自己又想到了难道从map中获取不存在的key时会报空指针异常?也不应该呀,如果key不存在,get会返回null,然后程序应该输出null才对。

后来,经过分析,发现这里面还有一个自动拆箱的过程。正是这个过程,才导致了空指针异常。

Map的value的类型是Long,它是long的包装类。map.get(2L),会返回null。正常来讲,Long value = map.get(2L);的写法时,value即可被赋值为null。
但是,如上面的代码所示,value被定义成了long,而非Long,那么,就会将从map中得到的null进行自动拆箱,于是导致了空指针异常。

四、问题解决

  • 将值取出后再次判断一下是否为null,然后再转换;
    public static void main(String[] args) {
    	Map<String, Long> map = new HashMap<String, Long>();
    	Long oldVal1 = map.put("money", 100L);	// map.get("money");
    	long oldVal2 = oldVal1 == null ? 0 : oldVal1;
    	System.out.println("正确写法:\t" + oldVal2 );
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值