Java常见的出现NullPointerException的场景

可能会出现空指针异常的情况大概有这几种

1.包装类型自动拆箱的时候出现空指针异常

    public void test3(){
        // 自动装箱
        int a=1;
        Integer b=a;
        System.out.println(b);
        Integer c=null;
        // 自动拆箱时如果c为null就会出现空指针异常
        a=c;
    }

2.字符串比较出现空指针异常

        String s=null;
        
        // 输出false
        System.out.println("".equals(s));
        
        // java.lang.NullPointerException
        s.equals("xxx");

3.A对象包含了B字段,通过A获取到了B之后没有判空直接用B进行调用

        Book book=new Book();
        // book.setName("laity");
        // 级联调用
        //book.getName().substring(0,3);
        String name = book.getName();
        // 此时输出的name为null
        System.out.println(name);
        // 此时再用name调用任何方法时都会出现空指针异常
         name.substring(0, name.length()-1);

4.类似ConcurrentHashMap这样键值都不支持为null的容器,强行put null

        // 一般情况下hashmap健值都允许为空,treemap健不能为空,值可以为空
        ConcurrentHashMap<String, String> concurrentHashMap=new ConcurrentHashMap();
        String a=null;
        concurrentHashMap.put(a,"哈啊哈准备迎接NullPointerException");

5.方法或远程服务返回的 List 不是空而是 null,没有进行判空就直接调用 List 的方法出现空指针异常。

  List<String> list=null;
        for(String s:list){
            System.out.println(s+“哈啊哈准备迎接NullPointerException”);
        }
### Java 中 `NullPointerException` 原因及解决方案 #### 一、原因分析 `java.lang.NullPointerException` 是由 `RuntimeException` 派生而来的一个运行时异常,通常发生在尝试访问未初始化的对象或变量时。具体来说: - 当一个对象为空(null),却试图对其进行操作(如调用方法或访问属性),则会触发此异常[^2]。 #### 二、常见场景 1. **业务逻辑错误** - 如果开发人员在编写代码时不仔细考虑边界条件,可能导致某些情况下返回 null 的对象被误认为是非空并加以使用[^1]。 2. **链式调用中的潜在风险** - 对于类似 `phone.getProducer().getName()` 这样的链式调用语句,在任何一个环节如果返回了 null,则后续的操作都会引发 `NullPointerException`。这种情形下应该允许异常发生以便暴露出数据质量问题而非简单地通过额外的 null 检查来隐藏问题所在[^3]。 3. **过度依赖显式的 null 检测** - 尽管可以在每次访问之前加入 if-else 结构来进行 null 判断以防止崩溃,但这会使代码结构变得复杂且难以维护。过多的分支判断不仅影响性能还降低了整体可读性和优雅度[^4]。 #### 三、预防措施与最佳实践 为了有效减少甚至消除 `NullPointerException` 的出现频率,可以采取以下策略: - 使用 Optional 类型替代原始引用类型作为函数参数或返回值; - 编写单元测试覆盖各种输入组合特别是那些能够导致 null 输出的情况; - 应用防御性编程原则比如设置合理的默认值或者提前终止流程避免不必要的计算; - 谨慎处理来自外部资源的数据流确保它们不会意外地带入 null 值进入内部系统环境之中; - 遵循面向对象设计模式中提倡的信息专家法则将责任分配给最合适的类成员负责管理自己的状态变化从而降低跨组件间传递不确定性的可能性。 ```java // 示例:利用Optional避免直接接触null public String getCarName(Car car){ return Optional.ofNullable(car).map(Car::getBrand).orElse("Unknown Brand"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值