我是靠谱客的博主 清脆跳跳糖,最近开发中收集的这篇文章主要介绍关于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空指针异常的问题!所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复