gpt4 book ai didi

java - BeanUtils 在 hashCode() 中抛出 NullPointerException

转载 作者:行者123 更新时间:2023-11-29 03:07:21 24 4
gpt4 key购买 nike

我正在使用 org.apache.commons.beanutils.BeanUtilsBean 在对象之间复制属性。但是它在 hashCode() 方法中抛出 NullPointerException 异常。当我检查 DB 时,prodcode 属性不是 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)

最佳答案

你有一个异常(exception),因为你正在复制到一个空的 dest具有 null 的 bean prodcode 中的值 field 。这条路dest.hashCode()抛出异常,结果是 dest.toString() (它使用调用哈希码的 Object.toString() 的默认实现)也抛出一个 NullPointerException . toString()方法由 BeanUtilsBean 调用进行调试输出:

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());

关于java - BeanUtils 在 hashCode() 中抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31450395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com