我目前正在组建一个小型客户端/服务器对,我遇到了ArrayLists的问题,我解决了这个问题,但想要了解更多信息。这是代码示例:
public double[] receiveMessage(int messageLength) throws IOException {
// wait for bytes
while (this.getInputStream().available() == 0) {
}
// read bytes
List<byte[]> incomingMessage = new ArrayList<byte[]>();
int byteLength = 8;
byte[] tempByte = new byte[byteLength];
while (this.getInputStream().available() != 0) {
this.getInputStream().read(tempByte, 0, byteLength);
incomingMessage.add(tempByte);
} ............
如果我在每次循环迭代时打印tempByte,我会收到我期望的唯一数组。但是,如果我要打印已完成列表的每个元素&#34; incomingMessage&#34;,我会收到相同的数组(最后一个tempByte数组)&#34; messageLength&#34;次。
当我将tempByte声明放在while循环中并在将其添加到列表后添加了tempByte = null时,此错误已得到修复。
虽然我不是编程专家,但我看到原始错误的原因是什么?
答案 0 :(得分:1)
问题在于:
byte[] tempByte = new byte[byteLength];
while (this.getInputStream().available() != 0) {
//...
}
tempByte
初始化一次并多次填充。最后,您将tempByte
中存储的相同的对象引用更改并存储到incomingMessage
中,因此您可以在List
中多次看到相同的数组tempByte
。
有两种可能的解决方案:
在尽可能窄的范围内初始化变量。在这种情况下,while
范围应位于while (this.getInputStream().available() != 0) {
//declare the variable here
byte[] tempByte = new byte[byteLength];
//...
}
循环内:
while
在byte[] tempByte = new byte[byteLength];
while (this.getInputStream().available() != 0) {
//...
//reinitialize the variable
tempByte = new byte[byteLength];
}
循环的每次迭代中重新初始化数组:
{{1}}
IMO你应该选择1比2来提高代码的可读性。
答案 1 :(得分:1)
您每次都在修改相同的byte[]
对象。您在while
循环的每次迭代中替换了数组的元素,然后调用了read
。
在数组中声明tempByte
修复问题的原因是您现在正在每次迭代期间创建一个新的独立字节数组。您现在添加了多个不同的数组,而不是多次添加一个数组。
答案 2 :(得分:1)
您将多次添加相同的对象(tempByte数组)到incomingMesage列表。在每次迭代中,您都会覆盖此数组的内容。
如果你想存储这样的数据,你需要将tempByte复制到新数组,你将在列表中插入。