2012-05-22 46 views
1

下面的代码被设计为需要一个字节[]和其他一些东西(请参阅它给出的代码)。然后它建立一定长度的数据包并返回。我的问题是,当我在一个文件中读入主程序时,我需要数据报数据包的缓冲区为剩余字节数(如果小于512)+4。这是处理读取请求的最后一个数据包的TFTP服务器。我在索引“buffer [bufferOffset] = data [dataOffset];”获得一个索引越界异常。任何人都可以帮助我理解为什么会发生这种情况,最好的解决办法是什么?IndexOutOfBounds - 需要帮助

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; 

} 
+2

请发布整个异常消息。至少要提及哪一个数组是破... – thkala

+0

三个字母:jdb – Kevin

+0

线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:223.它还声明异常在RRQ.doRRQ()的第49行(这是我在上面的帖子中提到的那一行)。不会给出打破阵列的名称。我怀疑它的缓冲区,但是它具有可变长度。并且程序只在最后一个数据包上出现错误 – DMo

回答

2

我没有看到你曾经看看data.length.难道data.length比sentBytes更大?如果是这样,你的循环应该超过sentBytes,而不是数据。

基本上,您决定缓冲区缓冲区长度的逻辑似乎与sentBytes的大小可疑分离。

1

这是你的代码重构为一个紧凑的形式:

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,所以问题可能在于方法的参数的值,就像它可能位于代码本身一样。你是法官。