HashMap的get()方法的NullPointerException问题

 更新时间:2021年09月13日 16:02:09   作者:ItsJingdai  
这篇文章主要介绍了HashMap的get()方法的NullPointerException问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

HashMap的get()方法的NullPointerException

今天写代码发现一个 bug,HashMap的 get() 方法一直报空指针异常,现记录一下。

看下面代码

private HashMap<Integer, Integer> cache;
private LinkedList<Integer> keyList;
private int capacity;
public LRUCache(int capacity) {
    cache = new HashMap<>();
    keyList = new LinkedList<>();
    this.capacity = capacity;
}
// Put it in the front if use
public int get(int key) {
    keyList.remove(new Integer(key));
    keyList.addFirst(key);
    return cache.get(key);
}

最后一行的 cache.get(key) 一直报 NullPointerException。

首先,LRUCache 对象我是 new 出来的,在构造函数会对 cache 进行初始化,不会是 null,debug 中也验证了,cache 不是 null。

接着去查看 Java API,如下:

V get(Object key)

Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.

Java API 明确说明当给定的 key 不存在时,会返回 null,不会抛出 NullPointerException 。

说明不是这里的问题,那既然会返回 null,好像懂了,如果 key 值不存在,当返回 null 时,如果用基本数据类型接收结果,如下面的代码。

public static void main(String[] args) {
    HashMap<Integer, Integer> map = new HashMap<>();
    int i = map.get(5);
}

这就会将 null 赋给 i ,这里会有一个自动拆箱过程,会调用返回值的 intValue() 方法并将结果赋值给 i,但是这个返回值是 null,那么 null.intValue() 便会出现 NullPointerException。

最开始的 return cache.get(key); 也是一样,返回值是 null,但是函数类型是 int,在转换时也出现了 NullPointerException。

所以虽然 HashMap 的 get() 方法不会出现 NullPointerException,但是在包装类和基本类型转换时还是可能会出现 NullPointerException ,编程时需要注意。

NullPointerException的一种情况

很久以前刚开始写代码的时候经常会从一些模板或者map、list或者一些对象里面取值

取到的值很可能是Object或某种类型 如果需要存储转化成String类型

我们会在后面加一个.toString()方法来强转

Map<String,Object> map = Maps.newHashMap();
String userName = map.get("username").toString();

如果我们取到了一个空值很可能会报空指针异常

我们可以尝试String mius = "";

String userName = map.get("username")+mius;

这样就不会报错了~

好久之前的小问题 分享一下 如有不足请补充,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅谈Java线程Thread.join方法解析

    浅谈Java线程Thread.join方法解析

    本篇文章主要介绍了浅谈Java线程Thread.join方法解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • SpringCloud之分布式配置中心Spring Cloud Config高可用配置实例代码

    SpringCloud之分布式配置中心Spring Cloud Config高可用配置实例代码

    这篇文章主要介绍了SpringCloud之分布式配置中心Spring Cloud Config高可用配置实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Java ShutdownHook原理详解

    Java ShutdownHook原理详解

    这篇文章主要介绍了Java ShutdownHook原理的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • 自定义注解+Spel实现分布式锁方式

    自定义注解+Spel实现分布式锁方式

    这篇文章主要介绍了自定义注解+Spel实现分布式锁方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringBoot加载启动的源码解析

    SpringBoot加载启动的源码解析

    这篇文章主要介绍了SpringBoot加载启动的源码解析,@SpringBootApplication注解是Spring Boot的核心注解,它其实是一个组合注解,本身其实也是一个IoC容器的配置类,需要的朋友可以参考下
    2023-12-12
  • Java中如何使用Gson将对象转换为JSON字符串

    Java中如何使用Gson将对象转换为JSON字符串

    这篇文章主要给大家介绍了关于Java中如何使用Gson将对象转换为JSON字符串的相关资料,Gson是Google的一个开源项目,可以将Java对象转换成JSON,也可能将JSON转换成Java对象,需要的朋友可以参考下
    2023-11-11
  • JavaWeb项目实现文件上传动态显示进度实例

    JavaWeb项目实现文件上传动态显示进度实例

    本篇文章主要介绍了JavaWeb项目实现文件上传动态显示进度实例,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04
  • java substring 截取字符串的方法

    java substring 截取字符串的方法

    这篇文章主要介绍了java substring 截取字符串的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • swing jtextArea滚动条和文字缩放效果

    swing jtextArea滚动条和文字缩放效果

    这篇文章主要为大家详细介绍了swing jtextArea滚动条和文字缩放效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Spring的IOC代码解析

    Spring的IOC代码解析

    这篇文章主要介绍了Spring的IOC代码解析,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论