IndexOutOfBounds - 必要なヘルプ
-
13-12-2019 - |
質問
下記のコードは、バイト[]と他のいくつかのことを取るように設計されています(それを与えるコードを参照)。その後、一定の長さのパケットを構築してこれを返します。私の問題は、私がメインプログラムへのファイルを読み込んだとき、データグラムパケットのバッファが必要なバイト数(512未満の場合)+ 4に必要なバイト数になる必要がある場合です。これはリードリクエストの最後のパケットを処理することです。TFTPサーバの。「バッファ[Buffer Offset]=データ[dataOffset]; "で範囲外例外の例外例外を取得します。なぜこれが起こっているのか、そしてそれの周りの最善の方法が何であるかを理解するのを助けることができますか?
public DatagramPacket doRRQ(byte[] data, int block, InetAddress address, int port, long fileSize, long sentBytes){
//takes file data and creates a buffer for a DATA packet to be used in a RRQ. This packet
//is passed to MyFirstTFTPServer.java to be modified and sent to client. This is done
int bufferOffset = 3;
int dataOffset = -1;
byte[] buffer = null;
long difference = 0;
int i = 512;
byte byteBlock = (byte)block++;//possible issue with block no increment. test.
if (sentBytes + 512 > fileSize){
difference = fileSize - sentBytes;
difference = difference + 4;
i = (int)difference;
buffer = new byte[i];
} else {
buffer = new byte[516];
}
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, port);
buffer[0] = 0;
buffer[1] = 3;
buffer[2] = 0;
buffer[3] = byteBlock;
for(byte item:data){
bufferOffset++;
dataOffset++;
buffer[bufferOffset] = data[dataOffset];
//System.out.println(bufferOffset);
//System.out.println(dataOffset);
}
return packet;
}
. 解決
data.length.
を見ている場所がわかりません.Data.lengthがSendBytesより大きい可能性がありますか?もしそうであれば、あなたのループはデータを越えて、データを越えないようにするべきです。
基本的に、バッファのバッファ長を決定するためのロジックは、SendBytesのサイズから不審に離婚しているようです。
他のヒント
これはあなたのコンパクトフォームにリファクタリングされたコードです:
public DatagramPacket doRRQ(byte[] data, int block, InetAddress address,
int port, long fileSize, long sentBytes)
{
final byte[] buffer =
new byte[sentBytes + 512 > fileSize? (int)(fileSize - sentBytes) + 4 : 516];
final DatagramPacket packet =
new DatagramPacket(buffer, buffer.length, address, port);
buffer[1] = 3;
buffer[3] = (byte)block;
for (int i = 0; i < data.length; i++) buffer[i+3] = data[i];
return packet;
}
.
今、何が起こっているのかは非常に明白です。バッファサイズの式はdata.length
で直接依存しないため、問題はコード自体に存在できるように、この方法はメソッドへの引数の値にある可能性があります。あなたは裁判官になります。
所属していません StackOverflow