前几天项目用到Map,接着调用Map.entrySet(),结果产生了一些意外的后果.
就是,持久化数据数据的时候出现setter of com.hiber.Hibernate.Test.id 异常.
此异常是提醒,pojo里面未有属性的getter.
因为我在其他方法里面保存过,未曾出现异常,觉得甚是奇怪.后来发现,原来是Map.entrySet()搞的鬼,根据java api.
返回此映射中包含的映射关系的 set 视图。返回的 set 中的每个元素都是一个 Map.Entry。该 set 受映射支持,所以对映射的改变可在此 set 中反映出来,反之亦然。如果修改映射的同时正在对该 set 进行迭代(除了通过迭代器自己的 remove 操作,或者通过在迭代器返回的映射项上执行 setValue 操作外),则迭代结果是不明确的。set 支持通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作实现元素移除,即从映射中移除相应的映射关系。它不支持 add 或 addAll 操作。
为此,我写了一个测试代码.
public class TestMap {
/**
* @param args
*/
public static void main(String[] args) {
Map test = new HashMap();
//测试,put进TestObject
for(int i=0; i<5; i++){
TestObject to = new TestObject();
test.put(new Integer(i), to);
}
//输出,这里进行类型强制转换,出现java.lang.ClassCastException.
for(Iterator it = test.entrySet().iterator(); it.hasNext();){
TestObjectt = (TestObject)it.next();
t.toString();
//System.out.println(t.);
}
//输出,这里直接转换成Object,并且输出的是自己定义的toString()
//且可以正常输出,为此,我不理解.为什么转换的时候保存.
//估计是里面做了些什么手脚.
for(Iterator it = test.entrySet().iterator(); it.hasNext();){
TestObjectt = (TestObject)it.next();
t.toString();
//System.out.println(t.);
}
}
}
class TestObject{
public String toString(){
System.out.println("TestObject");
return null;
}
}