问题描述
我正在使用org.apache.commons.beanutils.BeanUtilsBean
在对象之间复制属性。
但这会在hashCode()
方法中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)
1楼
您有一个例外,因为您要复制到在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());