发送/接收包含ArrayList的Serializable对象时遇到问题。我有一个看起来像这样的机器人:
public class Robot {
private ArrayList<InstructionCard> pool;
/*other fields... */
public void refillPool(Deck deck) {
int nCards = this.healthPoints - this.pool.size();
if(nCards >= 1) {
ArrayList<InstructionCard> cards = deck.draw(nCards);
//we add the cards to the old pool
for(int i = 0; i < cards.size(); i++) {
this.pool.add(cards.get(i)); // A
}
//pool = cards; //REPLACE THE FOR LOOP WITH THIS LINE DOES THE JOB
}
}
public RobotInfo getInfo(){
return new RobotInfo(this.pool);
}
}
我使用Robot对象中包含的信息来创建可通过连接发送的可序列化对象RobotInfo:
public class RobotInfo implements Serializable {
private ArrayList<InstructionCard> pool;
public RobotInfo(ArrayList<InstructionCard> p) {
pool = p;
}
}
但是,当我收到这样的对象时,该池是一个空的ArrayList。
InstructionCard implements Serializable
也是如此,它只包含一个int和一个String
字段。
我做了一些测试,我确信在发送RobotInfo
对象之前,pool.size()
不是0
。
当我收到包含它的消息时,pool.size() returns 0
,除非(这是我完全不理解的)我用refillPool()
方法直接替换for循环分配
我认为我必须在A点InstructionCard
引用时做错了(对我来说似乎不是Serializable
相关的问题)。
真正的问题是为什么RobotInfo
中的池在两种情况下都不是空的,但只有在我使用for循环时才变空?
编辑:我能够做出一个临时的解决方法,用ArrayList<InstructionCard>
替换ArrayList<String>
,每次需要发送RobotInfo对象时重新创建它。这在某种程度上让我觉得更多只是某种参考问题。
答案 0 :(得分:0)
我在这里猜测:
private ArrayList<InstructionCard> pool;
离开 pool
null 。
所以这段代码:
pool = cards;
会将非空引用放入池中。
另一方面;这意味着cards.size()
实际上是0
;因为你会遇到NullPointerException
:
for(int i = 0; i < cards.size(); i++){
this.pool.add(cards.get(i));