Java空指针异常:NullPointerException

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

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值