0

ここでインデックスの範囲外の例外が発生する理由を誰かが理解できますか? データの最初のロットを読み取ることができますが、これを再度ループしようとするとエラーになります。is.read(readBytes, offset, length); で「割り当てられた値は使用されません」というエラーも表示されます。これも一部。

InetAddress address = packet.getAddress();

int port = packet.getPort();

RRQ RRQ = new RRQ();

int offset = 0;
int length = 512;
int block = 0;

byte[] readBytes = new byte[512];

File file = new File(filename);
FileInputStream is = new FileInputStream(file);

int fileBytes = is.read(readBytes, offset, length);

DatagramPacket outPacket = RRQ.doRRQ(readBytes, block, address, port);
socket.send(outPacket);

block++;

if (fileBytes != -1)
{                   
    socket.receive(packet);

    offset = offset + fileBytes;

    System.out.println(offset);

    Exceptions here:fileBytes = is.read(readBytes, offset, length);

    outPacket = RRQ.doRRQ(readBytes, block, address, port);
    socket.send(outPacket);
    block++;
}
4

1 に答える 1

11

この呼び出しを見てください:

fileBytes = is.read(readBytes, offset, length);

offsetが 0の場合は問題ありませんが、0 でない場合は、512 バイトの長さだけの配列に 512 バイトを読み込むように要求していますが、配列の先頭から開始するわけではありません。したがって、512 バイトすべてに十分なスペースがありません。あなたが求めました。

私はあなたが欲しいと思う:

fileBytes = is.read(readBytes, offset, length - offset);

... または、オフセットを 0 のままにしておきます。何をするかは明確RRQ.doRRQではありませんが、渡さないのは疑わしいですoffset...

于 2012-05-21T18:47:45.243 に答える