NullPointerException在这里简称为NPE

通过一些实例总结下常见的NPE问题:

1. 自动拆箱抛NPE

实体类:

 public class User {
private String name;
private Integer age; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}

测试类:

 public class NPEDemo {

     public static void main(String[] args) {
method();
} static int method(){
User user = new User();
System.out.println("---" + new User().toString());
return user.getAge();
}
}

出错:

---User [name=null, age=null]
Exception in thread "main" java.lang.NullPointerException
at finaldemo.NPEDemo.method(NPEDemo.java:12)
at finaldemo.NPEDemo.main(NPEDemo.java:6)

分析错误原因:

包装类型为 null 时,进行自动转换为基本数据类型报错。

return user.getAge();

其中user不为空,但是user.getAge()为空(Integer类型)

而且method方法需要的返回类型是int,此时就自动进行了拆箱转换,即从Integer到int类型的转换。

而从Integer到int类型转换的时候user.getAge().intValue(); 会报空指针异常

解决方案:

返回之前进行判断与处理或者改为相同类型。

2. 级联调用易产生NPE

这段代码有点容易迷惑人,因为它进行了集合元素的 isEmpty 判断,按说不会出问题了吧。看代码:

 static void method1() {
List<User> list = new ArrayList<User>();
list.add(new User()); if (!CollectionUtils.isEmpty(list)) {
for (User user : list) {
System.out.println("userid:" + user.getAge().toString());
}
}
}

报错:

Exception in thread "main" java.lang.NullPointerException
at finaldemo.NPEDemo.method1(NPEDemo.java:18)
at finaldemo.NPEDemo.main(NPEDemo.java:9)

分析错误原因:

其实就是尽管你在之前做了对象不为空的判断,但你并不能保证对象中的值不为空,而且这时候去级联调用就会抛 NPE 。

手册中关于 NPE 的描述:

防止 NPE 是调用者的责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败、序列化失败、运行时异常等场景返回 null 的情况。 集合里的元素即使 isEmpty,取出的数据元素也可能为 null。 级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE

3. 关于 Equals
这是日常开发中用于相等比较使用最多的方法了吧,因为当年谁没被 == 坑过阿。现在一般我们都会这么写:

 public class NPEDemo {

     public static void main(String[] args) {
method1();
} static void method1() {
User user = new User();
user.getName().equals("men");
}
}

分析错误原因:

一不小心使用了 null 值调用了 Equals 方法。

解决方案:

很简单咯,这么写:"mafly".equals(user.getName());

equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。

 4.Map 下的 NPE
Map 应该是我们开发中使用最频繁的了,最常用的可能有 HashMapConcurrentHashMap 这俩了,可能会一不留神写出这样的代码:

 public class NPEDemo {

     public static void main(String[] args) {
method1();
} static void method1() {
User user = new User();
Map<Integer, Object> map = new HashMap<Integer, Object>();
map.put(user.getAge(), user.getName());
// System.out.println("---" + map);
Map<Integer, Object> map2 = new ConcurrentHashMap<Integer, Object>();
map2.put(user.getAge(), user.getName()); }
}

报错:

Exception in thread "main" java.lang.NullPointerException
at java.util.concurrent.ConcurrentHashMap.put(Unknown Source)
at finaldemo.NPEDemo.method1(NPEDemo.java:21)
at finaldemo.NPEDemo.main(NPEDemo.java:12)

分析错误原因:

可能我们知道 ConcurrentHashMap 的 K/V 都不能为空,但我们有时候并不知道传进来的值是否为空。

解决方案:

设置时做下检验,对它的特性正确理解及使用。

由于 HashMap 的干扰,很多人认为 ConcurrentHashMap 是可以置入 null 值,而事实上, 存储 null 值时会抛出 NPE 异常

Map 类集合 K/V 能不能存储 null 值的情况,如下表格:

集合类 Key Value Super 说明
Hashtable 不允许为 null 不允许为 null Dictionary 线程安全
ConcurrentHashMap 不允许为 null 不允许为 null AbstractMap 分段锁技术
TreeMap 不允许为 null 允许为 null AbstractMap 线程不安全
HashMap 允许为 null 允许为 null AbstractMap 线程不安全

常见的NullPointerException总结的更多相关文章

  1. Core Java 总结(异常类问题)

    所有代码均在本地编译运行测试,环境为 Windows7 32位机器 + eclipse Mars.2 Release (4.5.2) 2016-10-17 整理 下面的代码输出结果是多少?为什么?并由 ...

  2. Java异常处理和设计

    在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻 ...

  3. Java中的异常-Throwable-Error-Exception-RuntimeExcetpion-throw-throws-try catch

    今天在做一个将String转换为Integer的功能时,发现Integer.parseInte()会抛出异常NumberFormatException. 函数Integer.parseInt(Stri ...

  4. Java异常处理和设计【转】

    Java异常处理和设计 在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常 ...

  5. java 异常处理 Throwable Error 和Exception

    Java异常类层次结构图:       异常的英文单词是exception,字面翻译就是“意外.例外”的意思,也就是非正常情况.事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误. 比如使用 ...

  6. Java中异常处理和设计

    在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻 ...

  7. 201521123038 《Java程序设计》 第九周学习总结

    201521123038 <Java程序设计> 第九周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 ...

  8. 关于一些基础的Java问题的解答(三)

    11. HashMap和ConcurrentHashMap的区别   从JDK1.2起,就有了HashMap,正如上一个问题所提到的,HashMap与HashTable不同,不是线程安全的,因此多线程 ...

  9. Android开发过程中的坑及解决方法收录(三)

    bug:应用出现了 不幸运的,应用已停止的错误提示 排除问题: 1.intent接收数据的字符串不匹配 2.java常见的NullPointerException(空指针错误),可能由三个原因引起,字 ...

随机推荐

  1. 第八周总结and实验

    1.实验目的 理解异常的基本概念:掌握异常处理方法及熟悉常见异常的捕获方法. 2.实验要求 练习捕获异常.声明异常.抛出异常的方法.熟悉try和catch子句的使用.掌握自定义异常类的方法. 3.实验 ...

  2. []转帖]linux 上修改了nginx.conf 怎么重新加载配置文件生效

    linux 上修改了nginx.conf 怎么重新加载配置文件生效 https://www.cnblogs.com/zhuyeshen/ 步骤如下先利用/usr/local/nginx/sbin/ng ...

  3. 【转】mysql卸载(windows)

    作者:cxy_Summer 来源:CSDN 原文:https://blog.csdn.net/cxy_Summer/article/details/70142322 版权声明:本文为博主原创文章,转载 ...

  4. Codeforces 1140F Extending Set of Points (线段树分治+并查集)

    这题有以下几个步骤 1.离线处理出每个点的作用范围 2.根据线段树得出作用范围 3.根据分治把每个范围内的点记录和处理 #include<bits/stdc++.h> using name ...

  5. 在Asp.net core使用配置Json创建动态目录树

    一.前言 使用动态目录树可以使左边栏中的目录更加灵活,本文介绍如何将目录保存在json配置文件中,再读取出来经过处理后生成目录树. 二.数据结构 1. TreeMenuNode类名 将TreeMenu ...

  6. [转载]Jupyter Notebook中自动补全代码

    原文地址:https://yq.aliyun.com/articles/667928 在公众号之前的文章中,已经介绍了在Jupyter Notebook中设置主题以及输出代码文件到pdf文件中,本文来 ...

  7. SAP发布wbservice,如果有权限管控的话,需要给这个webservice加权限

    1. PFCG床架角色 2.在角色菜单上,添加其他,选中Authorization Default Values for Services 如下图 3.选中发布的webservice 后保存,如下图: ...

  8. linux下重启tomcat命令

    在Linux系统下,重启Tomcat使用命令操作的! 首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh 查看 ...

  9. 关于ftp无法链接的情况

    首先查看ftp是否安装 systemctl status vsftpd 如果没有先安装 yum install vsftpd 然后启动 systemctl start vsftpd 如果有报错 Job ...

  10. Java学习01-使用maven插件tomcat搭建web maven项目

    我使用社区版的IDEA,社区版的没有tomcat插件,只能使用maven插件进行tomcat的使用了,下面进入正题 一.pom.xml配置tomcat插件 <build> <fina ...