Java空指针异常(NullPointerException):空指针异常属于运行时异常(RuntimeException),即:编译会通过,但运行时会报异常。当你调用某个实例对象的方法时,如果该实例对象是个空引用,没有指向任何类,就会报空针。
日常开发中报空指针异常的常见场景:
场景1:调用某个对象的方法,但是实例化时,给该对象赋予了一个空引用,即该对象指向了空的引用,例如toString()
场景2:给引用变量赋值为null,自动拆箱时导致空指针异常
场景3:字符串常量未初始化,比较时顺序不当导致空指针异常,交换顺序即可避免报空指针异常
场景4:接口类型的对象没有使用具体的类进行初始化导致空指针异常
场景5:ConcurrentHashMap 这样的容器不支持 Key 和 Value 为 null,强行 put null 的 Key 或 Value 会出现空指针异常
import sun.applet.Main;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
/**
* @Description 测试报空指针异常的常用场景
* 总结与技巧:在遇到空指针错误时,要重点关注报错发生的所在行,通过空指针异常产生的两条主要原因(变量未初始化和对象为空)诊断具体的错误,主要注意以下几点:
* 检查使用之前是否进行了初始化;
* 尽量避免在函数中返回 null 值,如果必须要返回 null 值,一定要给出详细的注释信息;
* 外部传值时,一定要及时的进行判空处理(除非有明确的说明可以为 null );
* 使用 equals() 方法时,要遵循 "常量在前变量在后"的原则;
* 使用 valueOf() 替换toString();
* 通过返回空的 Collection 或 Array 来替代 null 值;
* 使用注解 @NotNull、@Nullable;
* 定义合理的默认值,遵守约定(比如设置默认值,设置是否允许为空,从而形成合理的约定);
* 从数据库取数据,可以约束哪些字段不能为空。
* Java中的8种数据类型,变量的值可以有其默认值,假如没有对其正常赋值,Java虚拟机是不能正确编译通过的,所以使用基本数据类型一般是不会引起空指针异常的。也就是说,在实际开发中大多数的空指针异常主要与对象的操作相关。
**/
public class NullPointerExceptionTest {
public static void main(String[] args) {
//场景1:调用某个对象的方法,但是实例化时,给该对象赋予了一个空引用,即该对象指向了空的引用,例如toString()
// AppendTest appendTest = null;
// System.out.println(appendTest.toString());
//场景2:给引用变量赋值为null,自动拆箱时导致空指针异常
// Integer str = null;
// int num = str;
// System.out.println(num);
//场景3:字符串常量未初始化,比较时顺序不当导致空指针异常,交换顺序即可避免报空指针异常
// String str = null;
// //不推荐把变量放常量前,当变量为空时,运行时报空指针,此处,把常量放变量前,即可避免报空指针
// if (str.equals("zhangsan")){
// System.out.println("相等");
// }else{
// System.out.println("不相等");
// }
//场景4:接口类型的对象没有使用具体的类进行初始化导致空指针异常
// List list1;
// List list2 = null;
// List list3 = new ArrayList();
// System.out.println("list1未被初始化,不能直接使用");
// System.out.println("list2会报空指针" + list2.isEmpty());
// System.out.println("list3正常运行" + list3.isEmpty());
//场景5:ConcurrentHashMap 这样的容器不支持 Key 和 Value 为 null,强行 put null 的 Key 或 Value 会出现空指针异常
//HashMap可以存入null,而ConcurrentHashMap不可以
// HashMap<String, Object> map1 = new HashMap<>();
// map1.put(null,null);
ConcurrentHashMap map2 = new ConcurrentHashMap();
map2.put(null,null);
System.out.println(map2);
}
}
总结与技巧:在遇到空指针错误时,要重点关注报错发生的所在行,通过空指针异常产生的两条主要原因(变量未初始化和对象为空)诊断具体的错误,主要注意以下几点:
- 检查使用之前是否进行了初始化;
- 尽量避免在函数中返回 null 值,如果必须要返回 null 值,一定要给出详细的注释信息;
- 外部传值时,一定要及时的进行判空处理(除非有明确的说明可以为 null );
- 使用 equals() 方法时,要遵循 "常量在前变量在后"的原则;
- 使用 valueOf() 替换toString();
- 通过返回空的 Collection 或 Array 来替代 null 值;
- 使用注解 @NotNull、@Nullable;
- 定义合理的默认值,遵守约定(比如设置默认值,设置是否允许为空,从而形成合理的约定);
- 从数据库取数据,可以约束哪些字段不能为空。
- Java中的8种数据类型,变量的值可以有其默认值,假如没有对其正常赋值,Java虚拟机是不能正确编译通过的,所以使用基本数据类型一般是不会引起空指针异常的。也就是说,在实际开发中大多数的空指针异常主要与对象的操作相关。
参考链接:https://blog.csdn.net/yaxuan88521/article/details/125079485
https://blog.csdn.net/x1113162924/article/details/126040562