前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java如何有效避免空指针

Java如何有效避免空指针

原创
作者头像
shigen
发布2023-11-29 08:21:50
1810
发布2023-11-29 08:21:50
举报

shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。

hello,伙伴们,shigen又来了,这篇稿子是周末的时候写出来的。今天的话题是:《Java如何有效的避免空指针》。

其实在阿里巴巴的《Java开发手册》里边,空指针,也就是NullPointerException 简称NPE的,怕一下子写出NPE,部分的伙伴看不懂,索性就改成了空指针。下文的空指针异常,我们用NPE表示。

在实际的开发中,我们最讨厌的就是遇到空指针了,业务跑着跑着发现了空指针。通过shigen的总结,多数的空指针都是从数据库中带来的,这又想让我提到mysql表设计的规范性问题。在这篇文章中,shigen就有讲到尽可能用not null定义字段

mysql字段设计
mysql字段设计

但是,所有的这些都是理想的状态,并不是每个人或者每个开发团队都会遵守这个规约的。遇到这样的项目,我们除了去改也没有办法。除了用java8的新特性Option外,shigen也写了一个工具类,实现了空指针的控制问题。那就先来看看代码吧。

代码语言:java
复制
public class ObjectUtil {

    /**
     * 把对象中的 String 类型的null字段,转换为空字符串
     *
     * @param <T>       待转化对象类型
     * @param object    待转化对象
     * @param fieldName 字段名字
     */
    public static <T> void noNullStringAttr(T object, String fieldName) {
        Field[] fields = object.getClass().getDeclaredFields();
        if (fields.length == 0) {
            return;
        }
        for (Field field : fields) {
            if ("String".equals(field.getType().getSimpleName())) {
                field.setAccessible(true);
                try {
                    Object value = field.get(object);
                    if (value == null && field.getName().equals(fieldName)) {
                        field.set(object, "");
                    }
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

这个代码其实就是用到了范型,我们传入对应的对象和对象的属性名字,通过反射获得字段的值,如果字段的值是空的,就让字段的值设置成空字符串,而不是null。这样,我们在使用的时候就会很好的避免到空指针的问题。

当然,我们的方法也可以稍微改造一下,直接把字段值为空的字段设置成默认值或者其它值,这个都是可以进一步的优化的。还是那句话:具体问题具体分析。

那使用起来也很简单,先看我怎么使用的吧。

代码语言:java
复制
    public static void main(String[] args) {
        // 构造参数:status, msg, data
        Result<Object> result = new Result<>(200, null, null);
        ObjectUtil.noNullStringAttr(result, "msg");
        System.out.println(result);

        User user = new User().setUsername("abc").setPassword(null);
        ObjectUtil.noNullStringAttr(user, "password");
        System.out.println(user);

        ObjectUtil.noNullStringAttr(user, "username");
        System.out.println(user);
    }

输出是这样的:

运行结果
运行结果

如果有值,我们就不管,没有值,就把字段的值设置成空字符串。

当然,用反射的方式也会破坏对象的结构,造成性能的损耗。哎,只是一个补救的办法,还是能规范就规范起来,这样才能解决很多不必要的麻烦。


以上就是今天分享的全部内容了,觉得不错的话,记得点赞 在看 关注支持一下哈,您的鼓励和支持将是shigen坚持日更的动力。同时,shigen在多个平台都有文章的同步,也可以同步的浏览和订阅:

平台

账号

链接

CSDN

shigen01

知乎

gen-2019

掘金

shigen01

腾讯云开发者社区

shigen

微信公众平台

shigen

公众号名:shigen

微信搜一搜
微信搜一搜

shigen一起,每天不一样!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档