当前位置: 代码迷 >> java >> BeanUtils在hashCode()中抛出NullPointerException 更新资料 更新资料
  详细解决方案

BeanUtils在hashCode()中抛出NullPointerException 更新资料 更新资料

热度:112   发布时间:2023-07-26 14:30:49.0

我正在使用org.apache.commons.beanutils.BeanUtilsBean在对象之间复制属性。 但这会在hashCode()方法中hashCode() NullPointerException异常。 当我检查DBprodcode属性不为null 因此,不应抛出NullPointerException

我的DTO object如下所示。 值得注意的是,我将与子设备相同的EquipmentDTO存储到该设备中。 所有设备具有相同的属性。 所以我使用递归模式。

例如。 一台父设备可以有许多子设备。

public interface Copiable {
     public Object copy();
}



public class EquipmentDTO implements Copiable {
    private Long equipid;
    private String prodcode;
    private List<EquipmentDTO > childEquipmentList;  // Recursively store child Equipment

    public EquipmentDTO () {
       super();
    }

    public Long getEquipmentid() {
       return equipid;
    }

    public void setEquipmentid(Long equipid) {
       this.equipid= equipid;
    }

    public String getProdcode() {
       return prodcode;
    }  
    public int hashCode() {
       return getProdcode().hashCode();
    }

        @Override
    public boolean equals(Object o){
       if(o == null)return false;

       if(!(o instanceof EquipmentDTO ) ) return false;

       EquipmentDTO other = (EquipmentDTO ) o;

       return this.prodcode.equals(other.getProdcode());

    } 
}

NullPointerException仅在生产环境中发生。 我使用Java 1.6,Oracle weblogic。

更新资料

BeanUtils代码段。

public static void copy(Object src, Object dest) {
     try {
        org.apache.commons.beanutils.BeanUtilsBean beanUtil = BeanUtilsBean.getInstance();
        beanUtil.getConvertUtils().register(false, true, 0);
        beanUtil.copyProperties(dest, src);
    } catch (InvocationTargetException ite) {
        //set dest to null if exception
        ite.printStackTrace();
        dest = null;
    } catch (IllegalAccessException iae) {
        //set dest to null if exception
        iae.printStackTrace();
        dest = null;
    }
}

更新资料

这是堆栈跟踪。

Caused By: java.lang.NullPointerException
    at com.xxxx.xxxx.xxx.vo.EquipmentDTO.hashCode(EquipmentDTO.java:361)
    at java.lang.Object.toString(Object.java:219)
    at java.lang.String.valueOf(String.java:2826)
    at org.apache.commons.beanutils.BeanUtilsBean.copyProperties(BeanUtilsBean.java:246)

您有一个例外,因为您要复制到在prodcode字段中具有null值的空dest bean。 这样, dest.hashCode()引发异常,结果dest.toString() (使用调用哈希码的Object.toString()默认实现)也会引发NullPointerException 调用toString()方法以生成调试输出:

if (log.isDebugEnabled()) {
    log.debug("BeanUtils.copyProperties(" + dest + ", " +
              orig + ")");
}

因此,这里dest转换为导致NullPointerException字符串。

通常,在Java中,始终假定对于已发布的对象toString()hashCode()equals()永远不会抛出异常。 因此,最好使用以下方法修复hashCode()实现:

String prodcode = getProdcode();
return prodcode == null ? 0 : prodcode.hashCode();

或者,如果您可以使用Java-7:

return Objects.hashCode(getProdcode());
  相关解决方案