今天做一個導出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類型默認爲空,使用過之後對象屬性就不會報空指針異常了