前言
小伙伴们大家好,最近一段时间家里有点事,没空写博客,现在事忙完啦。今天趁周末写一篇文章,希望对大家有所帮助。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,加油吧,小伙伴们,快快动起来,代码搞起来!