今天做一个导出excel的功能,需要导出八九十个字段,然后发觉一个字段报空指针异常,遂改用三元运算符,
cell2.setCellValue(prpSsalaries.get(i).getFixedSalary()==null?"0":prpSsalaries.get(i).getFixedSalary().toString());
后来发觉很多BigDecimal字段都为空,然后导出的时候报空指针异常,想想不可能这八九十个字段都加判断吧,然后就写了一个工具类,用来转换 Long,BigDecimal为空的(double默认为0,因此可以忽略),默认为0处理,创建一个辅助类,用于测试,代码如下:
import java.math.BigDecimal;
/**
* Created by hanjun on 2020/5/28.
*/
public class Test {
private Long Id;
private String name;
private BigDecimal basicSalary;
private BigDecimal notzero=new BigDecimal(1);
private double salaryAdd;
public Long getId() {
return Id;
}
public void setId(Long id) {
Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigDecimal getBasicSalary() {
return basicSalary;
}
public void setBasicSalary(BigDecimal basicSalary) {
this.basicSalary = basicSalary;
}
public double getSalaryAdd() {
return salaryAdd;
}
public void setSalaryAdd(double salaryAdd) {
this.salaryAdd = salaryAdd;
}
public BigDecimal getNotzero() {
return notzero;
}
public void setNotzero(BigDecimal notzero) {
this.notzero = notzero;
}
}
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
/**
* Created by hanjun on 2020/5/28.
*/
public class NoZeroUtil {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Test aa=new Test();
System.out.println("name:"+aa.getName());
System.out.println("salaryAdd:"+aa.getSalaryAdd());
System.out.println("basicSalary:"+aa.getBasicSalary());
System.out.println("id:"+aa.getId());
System.out.println("notzero:"+aa.getNotzero());
getbig(aa);
System.out.println("处理后为name:"+aa.getName());
System.out.println("处理后为salaryAdd:"+aa.getSalaryAdd());
System.out.println("处理后为basicSalary:"+aa.getBasicSalary());
System.out.println("处理后为id:"+aa.getId());
System.out.println("处理后notzero为:"+aa.getNotzero());
}
public static void getbig( Object object) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Field[] f=object.getClass().getDeclaredFields();
for(int i=0;i<f.length;i++){
//获取属相名
String attributeName=f[i].getName();
//将属性名的首字母变为大写,为执行set/get方法做准备
String methodName=attributeName.substring(0,1).toUpperCase()+attributeName.substring(1);
try{
if(f[i].getType()==BigDecimal.class&&getFieldValueByName(f[i].getName(), object)==null){
//获取属性类型,并且为空(不为空的当然不用赋值了,不然传进来对象有值属性都赋值为0,那不得搞你人)
Method setMethod=object.getClass().getMethod("set"+methodName,BigDecimal.class);
setMethod.invoke(object,new BigDecimal(0));
}else if(f[i].getType()==Long.class&&getFieldValueByName(f[i].getName(), object)==null){
Method setMethod=object.getClass().getMethod("set"+methodName,Long.class);
setMethod.invoke(object,0L);
}
}catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
//获取对象值
private static Object getFieldValueByName(String fieldName, Object o) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(getter, new Class[] {});
Object value = method.invoke(o, new Object[] {});
return value;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
运行结果为:可以看出double类型会默认为0,因此不用赋值,但是BigDecimal类型默认为空,使用过之后对象属性就不会报空指针异常了