java判断对象为空(对象为空和对象的值为空的区别)


前言

小伙伴们大家好,最近一段时间家里有点事,没空写博客,现在事忙完啦。今天趁周末写一篇文章,希望对大家有所帮助。java编写接口时总是会遇到传多个参数的情况,此时我们一般会习惯用对象封装。那么前端就需要给我们传递一个对象,而对象传过来后我们的必要操作就是首先判空,避免后续操作产生空指针或者其他错误。

一、object==null判断对象为空

这里我也是写了一个测试接口,首先使用object==null判断,话不多说上代码

controller层代码



import com.trs.dto.Boo;
import com.trs.service.FirstService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * Demo class
 *
 * @author crazy-water
 * @date 11/27/2021 18:21
 */
@RequestMapping("first")
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class firstWeekendController {
    
    

    private final FirstService firstService;

    @PostMapping("isNull")
    public void isNull(@RequestBody(required = false) Boo boo) {
    
    

         firstService.isNull(boo);

    }

}


service层代码

import com.sun.xml.internal.ws.util.StringUtils;
import com.trs.dto.Boo;
import com.trs.service.FirstService;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

/**
 * Demo class
 *
 * @author crazy-water
 * @date 11/27/2021 18:28
 */
@Service
public class FirstServiceImpl implements FirstService {
    
    
    @Override
    public void isNull(Boo boo) {
    
    

        System.out.println(boo);

        String a = boo==null ? "boo是空" : "boo非空";

        System.out.println("==null判断结果是-----"+a);


    }
}


这种情况比较简单,就不多做介绍,直接上结果(此处采用的测试工具是postman)

第一种情况不传对象,结果如下,显然接口收不到对象,那么对象肯定是空不存在任何引用。
在这里插入图片描述

在这里插入图片描述

第二种 传空对象,这种情况是我们最需要注意的,往往出问题的就是这一种,我们今天着重讲的也是这一种。结果如下图,明明传递的是空对象,但是结果确是对象非空,曾经这个问题也曾困扰过我。后来仔细思考后发现这个对象只是值为空,但是 这个对象确是存在的,其以及被创建出来啦。举个例子,有一个空桶,虽然桶是空的,但是桶确是存在的。由此可见,object==null只能判断有没有桶,却不能判断桶是否为空的情况,由此引入判断桶空的方法,见步骤二。

在这里插入图片描述
在这里插入图片描述

二、判读对象的值为空

1.利用反射编写判空工具类

在这里就把工具类贴出来了,有需要的小伙伴可以直接打包带走。


import java.lang.reflect.Field;
import java.lang.reflect.Type;

/**
 * <p>Description: 判断对象是否为空,进一步判断对象中的属性是否都为空 </p>
 * @author crazy-water
 * @date 2018年11月12日
 */
public class JudgeObjIsNullUtil {
    
    
    
    /**
     * 判断对象是否为空,且对象的所有属性都为空
     * ps: boolean类型会有默认值false 判断结果不会为null 会影响判断结果
     *     序列化的默认值也会影响判断结果
     * @param object
     * @return
     */
    public static   boolean judgeObjIsNull(Object object){
    
    
        Class clazz = object.getClass(); // 得到类对象
        Field fields[] = clazz.getDeclaredFields(); // 利用反射得到所有属性
        boolean flag = true; //定义标志flag
        /**
         * 循环遍历反射得到的属性数组,判断每个属性值是否为空
         */
        for(Field f : fields){
    
    
            f.setAccessible(true);//由于考虑到某些私有属性直接访问肯能访问不到,此属性设置为true确保可以访问到
            Object fieldValue = null;
            try {
    
    
                fieldValue = f.get(object); //得到属性值
                Type fieldType =f.getGenericType();//得到属性类型
                String fieldName = f.getName(); // 得到属性名
                System.out.println("属性类型:"+fieldType+",属性名:"+fieldName+",属性值:"+fieldValue);
            } catch (IllegalArgumentException e) {
    
    
                e.printStackTrace();
            } catch (IllegalAccessException e) {
    
    
                e.printStackTrace();
            }
            if(fieldValue != null){
    
      //只要有一个属性值不为null 就返回false 表示对象不为null
                flag = false;
                break;
            }
        }
        return flag;
    }
    
}

2.测试

使用上述的发射工具类,看看是否可以判断空对象,结果如下图,可见可以正常判断,并且打印出各个属性的具体情况。


import com.trs.dto.Boo;
import com.trs.service.FirstService;
import com.trs.util.JudgeObjIsNullUtil;
import org.springframework.stereotype.Service;

/**
 * Demo class
 *
 * @author crazy-water
 * @date 11/27/2021 18:28
 */
@Service
public class FirstServiceImpl implements FirstService {
    
    
    @Override
    public void isNull(Boo boo) {
    
    

//        System.out.println(boo);
//
//        String a = boo==null ? "boo是空" : "boo非空";
//
//        System.out.println("==null判断结果是-----"+a);

        boolean b = JudgeObjIsNullUtil.judgeObjIsNull(boo);
        System.out.println(b==true ?"boo为空" :"boo不为空");

    }
}


在这里插入图片描述

在这里插入图片描述

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

学会了对象判空的方法,可以减少程序后面可能会出的Bug,加油吧,小伙伴们,快快动起来,代码搞起来!

Guess you like

Origin blog.csdn.net/fengzi_big/article/details/121595658