我是靠谱客的博主 清脆跳跳糖,最近开发中收集的这篇文章主要介绍关于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 );
    }
    

最后

以上就是清脆跳跳糖为你收集整理的关于Map不为空,put时却报java.lang.NullPointerException空指针异常的问题!的全部内容,希望文章能够帮你解决关于Map不为空,put时却报java.lang.NullPointerException空指针异常的问题!所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部