一.问题
小栗子
空指针异常是Java编程中最常见的异常之一。它通常发生在尝试使用空对象引用时。例如,如果您尝试调用一个空对象的方法,则会抛出空指针异常。这是因为该对象没有被实例化,因此没有任何方法可以调用。
以下是一个示例代码,演示了如何在Java中触发空指针异常:
String str = null;
System.out.println(str.length());
在上面的代码中,str变量被初始化为null。当您尝试调用str.length()时,就会空指针异常
空指针异常是Java中最常见的异常之一。空指针异常的原因有以下几种:1、调用空对象的实例方法;2、访问或修改字段或一个空对象;3、以null的长度作为数组;4、访问或修改null插槽,就好像它是一个数组一样;5、将null视为Throwable值。
/4/12(1) java空指针异常解决_Java中的空指针异常是什么以及如何解决?_cunjiu9486的博客-CSDN博客. https://bing.com/search?q=%e7%a9%ba%e6%8c%87%e9%92%88%e5%bc%82%e5%b8%b8%e7%9a%84%e5%8e%9f%e5%9b%a0 访问时间 2023/4/12.
(2) java空指针异常:java.lang.NullPointException - thinker_zhao - 博客园. https://www.cnblogs.com/ttflove/p/6033393.html 访问时间 2023/4/12.
(3) 空指针异常是什么原因-常见问题-PHP中文网. https://www.php.cn/faq/466089.html 访问时间 2023/4/12.
(4) 空指针异常主要原因以及解决方案_接口空指针异常_小羊咩恩的博客-CSDN博客. https://blog.csdn.net/qq_38697767/article/details/103452712 访问时间 2023/4/12.
(5) NullPointerException - 廖雪峰的官方网站. https://www.liaoxuefeng.com/wiki/1252599548343744/1337645544243233 访问时间 2023/4/12.
二.空指针的含义
1空对象;
在Java中,空对象是指一个引用变量没有通过new分配内存空间,这个对象就是空对象,Java使用关键字null表示空对象。产生空对象主要有以下两种可能性: 1 程序员自己忘记了实例化,所以程序员必须防止这种情况发生,应该仔细检查自己的代码,为自己创建的所有对象进行实例化并初始化。 2 空对象是其它地方传递过来的,需要通过判断对象是否为 null 进行避免。¹²
对象的其中几个属性为null,是空对象吗
不是空对象。空对象是指一个引用变量没有通过new分配内存空间,这个对象就是空对象,Java使用关键字null表示空对象。如果一个对象的其中几个属性为null,那么这个对象仍然不是空对象,因为它已经被实例化了。
空对象是指该对象的所有属性都为null吗
不是所有属性都为null,而是该对象没有通过new分配内存空间,这个对象就是空对象,Java使用关键字null表示空对象。如果一个对象的所有属性都为null,那么这个对象仍然不是空对象,因为它已经被实例化了。
(只有new 的时候就是实例化)
2空元素
在Java中,空元素是指一个没有元素内容的元素,例如,一个空的ArrayList就是一个空元素。⁴⁵⁶
源: 与必应的对话, 2023/4/12(1) Java ArrayList isEmpty() 方法 | 菜鸟教程. https://www.runoob.com/java/java-arraylist-isempty.html 访问时间
(2) 【Java】Java中空字符的写法_小镇攻城狮的博客-CSDN博客. https://blog.csdn.net/Awt_FuDongLai/article/details/115374860
(3) Java中空对象(null)引用方法及属性简单分析! - CSDN博客. https://blog.csdn.net/lgh2691861/article/details/52248038
(4) HTML_空元素(标签)详解 - 简书. https://www.jianshu.com/p/c9a262d5704c
(5) 空元素在开始标签中进行关闭 什么意思 - 百度知道. https://zhidao.baidu.com/question/243350668.html
(6) HTML中的空元素 - 范仁义 - 博客园. https://www.cnblogs.com/Renyi-Fan/p/12064557.html
3空指针
什么是空指针
在Java中,指针是一个引用变量,它指向一个对象。就是一个内容为内存地址的变量
如果一个引用变量的值为null,那么它就不指向任何有效的对象,这时如果试图调用一个空对象的属性或方法时,会抛出空指针异常(NullPointerException)¹²。因此,在访问一个对象之前,需要先判断该对象是否为空。例如:if (object != null) { // 对象不为空 }。
如何避免空指针
当valueOf()和toString()返回相同的结果时,宁愿使用前者。
三.解决:
整体思想:
在Java中,避免空指针异常的方法有很多。其中一种方法是使用assert关键字检查对象是否为null。另一种方法是使用Optional类,它可以避免空指针异常并提高代码的可读性。此外,还可以使用if语句或三目运算符检查代码中是否存在null值
常见解决方法:
原博文江南一棵树
1字符串
StringUtils.isBlank(str)
StringUtils.isNotBlank(str)
等价于str != null && str.length > 0 && str.trim().length > 0
而StringUtils.isNotEmpty
等价于str != null && str.length > 0
2集合
if(list!=null && list.size()>=0){
//判断list是否为空,且list集合中包含的元素个数小于等于0个
}
等价于isEmpty()
//判断集合是否为空(包括null和没有元素的集合)。
//可以使用以下代码进行简化:
if (CollectionUtils.isEmpty(simuSubjectTaskList) || (simuSubjectTaskList.size() == 1 && "0".equals(simuSubjectTaskList.get(0).getParentSimuTaskTypeUuid()))) {
}
这个简化做了两个修改:
- 使用
CollectionUtils.isEmpty()
方法来判断simuSubjectTaskList是否为null或空列表。 - 删除了原来的
simuSubjectTaskList.size() == 0
部分,因为可以用CollectionUtils.isEmpty()
来代替。
这样,代码更加简洁并且可读性更好。
3数组
if(list!=null && list.length()>0){
//判断list是否为空,且list集合中包含的元素个数小于等于0个
}
注意:数组长度=0,不一定是null。所以length=0不能作为判空的条件
可以使用以下代码进行简化:
string[] arr=new string[];
if (flag && ArrayUtils.isEmpty(arr)) {
}
这个简化做了两个修改:
- 使用
ArrayUtils.isEmpty()
方法来判断simuRequirement.getGmtScope()是否为null或空数组。 - 将条件判断中的括号进行简化。
这样,代码更加简洁并且可读性更好。
4对象
Objects.isNull(message)
java8的新特性 optional
四‘发现一个有意思的现象
允许在初始化的时候设置引用变量为null,如果接下来不对其做任何操作直接去访问的话会报空指针异常,为什么要允许初始化的时候设置为null呢,