详解Java如何有效避免空指针

 更新时间:2023年12月17日 11:39:53   作者:shigen01  
空指针,也就是NullPointerException 简称NPE的,怕一下子写出NPE,部分的伙伴看不懂,索性就改成了空指针,在实际的开发中,我们最讨厌的就是遇到空指针了,业务跑着跑着发现了空指针,所以本文详细介绍了Java如何有效的避免空指针,需要的朋友可以参考下

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

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

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

 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。这样,我们在使用的时候就会很好的避免到空指针的问题。

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

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

     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);
     }

输出是这样的:

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

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

以上就是详解Java如何有效避免空指针的详细内容,更多关于Java避免空指针的资料请关注脚本之家其它相关文章!

相关文章

  • 简单介绍java中equals以及==的用法

    简单介绍java中equals以及==的用法

    这篇文章主要介绍了简单介绍java中equals以及==的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 深入浅析Java反射机制

    深入浅析Java反射机制

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制
    2015-11-11
  • SpringBoot 项目中的图片处理策略之本地存储与路径映射

    SpringBoot 项目中的图片处理策略之本地存储与路径映射

    在SpringBoot项目中,静态资源存放在static目录下,使得前端可以通过URL来访问这些资源,我们就需要将文件系统的文件路径与URL建立一个映射关系,把文件系统中的文件当成我们的静态资源即可,本文给大家介绍SpringBoot本地存储与路径映射的相关知识,感兴趣的朋友一起看看吧
    2023-12-12
  • 详解jvm中的标量替换

    详解jvm中的标量替换

    这篇文章主要介绍了详解jvm中的标量替换,帮助大家更好的理解和使用Java虚拟机,感兴趣的朋友可以了解下
    2020-09-09
  • Java JVM字节码指令集总结整理与介绍

    Java JVM字节码指令集总结整理与介绍

    本节将会着重介绍一下JVM中的指令集、Java是如何跨平台的、JVM指令集参考手册等内容。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Spring Security 基于URL的权限判断源码解析

    Spring Security 基于URL的权限判断源码解析

    这篇文章主要介绍了Spring Security 基于URL的权限判断问题,我们想要实现自己的基于请求Url的授权只需自定义一个 AccessDecisionManager即可,接下来跟随小编一起看看实现代码吧
    2021-12-12
  • Java实现Fibonacci(斐波那契)取余的示例代码

    Java实现Fibonacci(斐波那契)取余的示例代码

    这篇文章主要介绍了Java实现Fibonacci取余的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • SpringBoot:JPA + AuditingEntityListener时区设置方式

    SpringBoot:JPA + AuditingEntityListener时区设置方式

    这篇文章主要介绍了SpringBoot:JPA + AuditingEntityListener时区设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java自定义注解对枚举类型参数的校验方法

    Java自定义注解对枚举类型参数的校验方法

    文章介绍了如何使用Java注解对枚举类型参数进行校验,通过自定义注解和注解校验类实现参数的灵活性校验,感兴趣的朋友一起看看吧
    2025-01-01
  • Spring Cloud Gateway 远程代码执行漏洞(CVE-2022-22947)的过程解析

    Spring Cloud Gateway 远程代码执行漏洞(CVE-2022-22947)的过程解析

    Spring Cloud Gateway 是基于 Spring Framework 和 Spring Boot 构建的 API 网关,它旨在为微服务架构提供一种简单、有效、统一的 API 路由管理方式,这篇文章主要介绍了Spring Cloud Gateway 远程代码执行漏洞(CVE-2022-22947),需要的朋友可以参考下
    2022-08-08

最新评论