如何优雅的避免Java中:NullPointerException(空指针异常)

news2024/9/25 17:12:37

目录

1:空指针问题

2:解决方法

第一种方式:

第二种方式:

第三种方式:

第四种方式:


1:空指针问题

Java是没有指针的,所以我们常说"Java 指针"就是指"Java 的引用"。空指针就是空引用,Java空指针异常就是引用本身为空,但却调用了方法,这个时候就会出现空指针异常



public class demo {
    public static void main(String[] args) {
        Address address = new Address();
        User user = new User("xia", 12, address);
        String cityName = user.getAddress().getCity().trim();
        System.out.println(cityName);
    }
}


Address:


@Data
@NoArgsConstructor
@AllArgsConstructor
public class Address {

    private String city;
    private String address;
}



User:


@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String name;

    private Integer age;

    private Address address;
}

2:解决方法

第一种方式:

使用if 来进行非空判断


/**
     使用if 条件判断,但是这种写法不优美
*/

public class demo {
    public static void main(String[] args) {
        Address address = new Address();
        User user = new User("xia", 12, address);
        if (user != null){
            Address userAddress = user.getAddress();
            if (userAddress != null) {
                String city = address.getCity();
                if (city != null && !"".equals(city)){
                    System.out.println(user.getAddress().getCity().trim());
                }
            }
        }
    }
}

第二种方式:

使用Optional.ofNuallable 来进行处理


public class demo {
    public static void main(String[] args) {
        Address address = new Address();
        User user = new User("xia", 12, address);
        String ored = Optional.ofNullable(user)
                .map(User::getAddress)
                .map(Address::getCity)
                .map(String::trim)
                .orElse("default");
        System.out.println(ored);

    }
}

第三种方式:

使用Assert 断言



public class demo {
    public static void main(String[] args) {
        Address address = new Address();
        User user = new User("xia", 12, address);
        getUserCity(user);
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        getUserCity(null);

    }
    public static void getUserCity(User user){
        Assert.notNull(user,"user is null");
        Address address = user.getAddress();
        Assert.notNull(address,"address is null");
        String city = address.getCity();
        System.out.println(city);
    }
}

第四种方式:

使用@Nullable 注解(代码会有提示)


public class demo {
    public static void printString(@Nullable String str){
        System.out.println(str.toString());
    }
    @Nullable
    public static String getString(){
        return null;
    }
    public static void main(String[] args) {
        Address address = new Address();

        String str = null;
        printString(str);
        getString().toString();
        User user = new User();
        System.out.println(user.getAddress().getCity());
    }

}

提示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[RoarCTF 2019]Easy Calc1

看这个输入框,所以我猜测可能是sql注入,弹出了一个对话框,说算不来,说明可能存在过滤 最后发现只要传入字母都会触发弹窗,应该跟题目设定有关系,这只是一个简单的计算器而已 查看了一下源码,发现…

联邦学习 (FL) 中常见的3种模型聚合方法

联邦学习 (FL) 中常见的3种模型聚合方法 联合学习 (FL) 是一种出色的 ML 方法,它使多个设备(例如物联网 (IoT) 设备)或计算机能够在模型训练完成时进行协作,而无需共享它们的数据。 “客户端”是 FL 中使用的计算机和设备&#x…

Java设计模式之一:装饰器模式

目录 一、什么是装饰器模式 二、装饰器模式如何使用 三、装饰器模式的优势和应用场景 一、什么是装饰器模式 装饰器模式是一种结构型设计模式,允许通过动态地将新功能添加到现有对象上,来扩展其行为或修改其外观,同时不改变其原始类的结构…

模型轻量化神器:3D格式转化工具HOOPS Exchange可将文件压缩小100倍!

​领先的CAD导入和导出库 使用用于CAD数据转换的HOOPS Exchange SDK将30多种CAD文件格式导入到您的应用程序中,具有对2D和3D CAD文件格式(包括 CATIA、SOLIDWORKS、Inventor™、Revit™、Creo、 NX™、Solid Edge 等,全部通过单个API实现。 …

TikTok品牌出海:打造独特内容,提升品牌影响力

随着社交媒体的迅猛发展,TikTok作为全球最热门的短视频平台之一,为品牌出海提供了独特的机遇。然而,要在TikTok上成功推广品牌,关键在于创造出引人注目、有吸引力的内容。本文Nox聚星将和大家探讨在TikTok上,什么样的内…

HTML写一个16:9自适应的页面

效果图&#xff1a; 页面可以按照窗口大小自适应变化&#xff0c;并且可以保持16:9 <!DOCTYPE html> <html><head><style>body {margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;height: 100vh;}#box {width: calc(…

APP外包开发的用户行为分析工具

APP开发完成上线后&#xff0c;运营人员希望得到用户在使用APP过程中的行为数据&#xff0c;比如更喜欢哪个功能、停留时长、使用路径等指标数据&#xff0c;这对于产品的下一步改进非常重要。运营和产品人员有了这些数据才能更好的设计新功能。今天和大家分享这方面的工具&…

【动手学习深度学习--逐行代码解析合集】05softmax回归简洁实现

【动手学习深度学习】逐行代码解析合集 05softmax回归简洁实现 视频链接&#xff1a;动手学习深度学习–softmax回归简洁实现 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 代码 net.apply()若不懂可参考: https://blog.csdn.…

第八章CAS策略

文章目录 JDK提供的原子类没有CAS之前引入CAS之后 CAS是什么CAS原理代码演示如何保证的原子性硬件级别保证 源码分析CAS底层原理&#xff1f;如果知道&#xff0c;谈谈你对UnSafe的理解例子atomicInteger.getAndIncrement()为什么安全 自定义原子引用CAS与自旋锁实现自旋锁 CAS…

SD卡可以数据恢复吗 SD卡数据恢复软件

随着数码设备的普及和存储容量的不断增加&#xff0c;SD卡已经成为我们常用的存储介质之一。在使用过程中&#xff0c;不可避免地会遇到SD卡数据丢失的情况&#xff0c;可能是因为误操作、格式化、病毒感染或物理损坏等。幸运的是&#xff0c;现在有许多专业的SD卡数据恢复软件…

Guava RateLimiter:原理、源码和思想

Guava RateLimiter&#xff1a;原理、源码和思想 三种限流算法计数器法漏桶算法令牌桶算法 RateLimiterRateLimiter的使用RateLimiter原理RateLimiter获取令牌获取令牌的基本流程获取令牌的详细源码解读 RateLimiter的两种限流器试验&#xff1a;感受两种限流器的区别SmoothBur…

Mysql 事务优化

事务的ACID特性: 原子性(Atomicity):当前事务的操作要么同时成功&#xff0c;要么同时失败。原子性由undo log日志来保证 一致性(Consistency):使用事务的最终目的&#xff0c;由业务代码正确逻辑保证 隔离性(lsolation):在事务并发执行时&#xff0c;他们内部的操作不能互相…

Ai 制作简单的iconfont字体图标

打开网址https://www.iconfont.cn/icons/upload?spma313x.7781069.1998910419.d059fa781 下载矢量图标设计模板,如图 打开下载的图标制作模版.ai文件 点击椭圆工具画一个大小为900*900的圆 点击文字工具&#xff0c;输入文字内容并调整为合适的大小&#xff0c;例610px …

欧科云链OKLink:2023年6月安全事件盘点

一、基本信息 2023年6月REKT和RugPull事件约造成约1000万美元损失&#xff0c;相比上月有显著下降&#xff0c;但安全事件发生数量依旧不减。其中被废弃的Atlantis Loans遭受治理攻击&#xff0c;造成的损失超250万美元&#xff0c;对该协议有过授权的用户需及时撤销授权。另外…

GRU、LSTM、注意力机制(第八次组会)

GRU、LSTM、注意力机制(第八次组会) 一、 GRU二、 LSTM三、 深度RNN、双向RNN四、 注意力机制一、 GRU 二、 LSTM 三、 深度RNN、双向RNN

机器学习实验-决策树、朴素贝叶斯、KNN模型的应用

实验 决策树-西瓜数据集基于基尼系数剪枝人体运动状态预测数据集西瓜数据集人体特征数据集 机器学习 数据集有两个&#xff0c;一个是西瓜数据集&#xff0c;另一个是人体特征数据集 决策树-西瓜数据集 基于信息熵准则进行划分选择的决策树算法的实现过程(不使用现有的机器学习…

有必要使用性能测试工具吗?

有必要使用性能测试工具吗&#xff1f;性能测试工具是一种帮助开发人员和测试人员评估应用程序、网站或系统性能的软件。这些工具主要用于测量响应时间、吞吐量、并发用户数、资源利用率等指标&#xff0c;以及发现系统瓶颈和瓶颈原因&#xff0c;那其作用意义有哪些&#xff1…

Flutter Linux desktop桌面版Build App流程

Flutter Linux desktop桌面版Build App流程 Flutter 是 Google推出并开源的移动应用开发框架&#xff0c;主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App&#xff0c;一套代码同时运行在 iOS 和 Android平台。 Flutter提供了丰富的组件、接口&#xff0c;开发者…

maven-mvnd 的使用

maven-mvnd是Apache Maven团队借鉴了Gradle和Takari的优点&#xff0c;衍生出来的更快的构建工具&#xff0c;是maven的强化版。 github地址&#xff1a;https://github.com/apache/maven-mvnd maven-mvnd 特性&#xff1a; 嵌入 Maven (所以不需要单独安装 Maven)&#xff…

【kubernetes系列】kubernetes之initcontainer初始化容器

概述 Init Container就是用来做初始化工作的容器&#xff0c;可以是一个或者多个&#xff0c;如果有多个的话&#xff0c;这些容器会按定义的顺序依次执行&#xff0c;只有所有的Init Container执行完后&#xff0c;主容器才会被启动。我们知道一个Pod里面的所有容器是共享数据…