HashMap的get()方法的NullPointerException问题
作者:ItsJingdai 发布时间:2023-09-23 07:24:12
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;
这样就不会报错了~
好久之前的小问题 分享一下 如有不足请补充,希望能给大家一个参考。
来源:https://blog.csdn.net/qq_41512783/article/details/110819487
猜你喜欢
- 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。 一、静态库和动态库的区别1. 静态函数库这类库的
- 一、叙述当Spring的事件(Application Event)为Bean和Bean之间的消息同步提供了支持。当一个Bean处理完成一个任
- 前言:文件的上传和下载在日常开发中很是常见,那么这一功能是如何实现的呢,下面我给大家介绍一下实现条件:1、需要一个form标签,method
- 今天给大家介绍一下SpringBoot中JPA的一些常用操作,例如:增删改查、分页、排序、事务操作等功能。下面先来介绍一下JPA中一些常用的
- 通用配置#下面介绍的整合JDBC和整合MyBatis都需要添加的实体类和配置数据库表#CREATE TABLE `user` ( `id`
- 具体代码如下所示:***web.xml***<?xml version="1.0" encoding="
- 1 SharedPreferences 介绍SharedPreferences是使用键值对的方式来存储数据的SharedPreference
- 本文实例为大家分享了C# GDI+实现时钟表盘的具体代码,供大家参考,具体内容如下一、设计如下图界面按键“打开时钟&am
- 直接用英文逗号分隔就可以了,比如:inerface IHello { String sayHello(String name);
- SpringCloudStream配置以下配置摘自《SpringCloud微服务实战》,配置主要包括两大部分:Stream配置(基础配置、通
- java有两种类型的classload,一种是user-defined的,一种是jvm内置的bootstrap class loader,所
- 本文实例讲述了Java Web项目部署在Tomcat运行出错与解决方法。分享给大家供大家参考,具体如下:1、在部署Java Web项目的过程
- springboot微服务内置了tomcat,在工程目录下执行:mvn clean package,可以将项目打成jar,通过java -j
- 前言本文主要给大家介绍了关于Java读取二进制文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。读Hex写CS
- 基于Java的简单的用户管理系统,供大家参考,具体内容如下此系统功能和方法都比较简单本次系统通过控制台输入商品的基本信息,加入管理员的登录与
- 使用JAVA工程管理越来越多的jar包,担心导错了,多导了,漏导了怎么办?换一个IDE项目后项目会不会出一堆BUG,看的头皮发麻?自己写的代
- 本文实例为大家分享了Struts2框架拦截 器实例的示例代码,供大家参考,具体内容如下在看拦截 器的小例子的前我们先来看看sturts2的原
- AsyncTask什么是AsyncTaskAsyncTask是一个轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和结果传
- 开发 Web 应用的思路实现一个简单的 JSP/Servlet。搭建创建 Web 应用工程的环境。创建 Web 应用工程。Web 应用工程的
- 样例代码在讲 Flutter 的盒子模型前,先看看HTML 中的盒子模型。如下图所示,一个页面元素包括了与父级容器的外边距(margin),