【问题标题】:IndexOutOfBounds - help neededIndexOutOfBounds - 需要帮助
【发布时间】:2012-05-22 20:27:51
【问题描述】:

下面的代码旨在获取一个 byte[] 和其他一些东西(参见它给出的代码)。然后它构建一个具有一定长度的数据包并返回它。我的问题是当我将文件读入主程序时,我需要数据报包的缓冲区为剩余要发送的字节数(如果小于 512)+ 4。这是为了处理读取请求的最后一个数据包TFTP 服务器。我在“buffer[bufferOffset] = data[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;

}

【问题讨论】:

  • 请发布整个异常消息。至少提到哪个数组是破坏的......
  • 线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 223。它还指出异常位于 RRQ.doRRQ() 的第 49 行(这是我在上面的帖子中提到的行。 )。没有给出中断的数组的名称。我怀疑它是缓冲区之一,因为它具有可变长度。并且程序仅在最后一个数据包上出错
  • 凯文。请详细说明?

标签: java indexoutofboundsexception


【解决方案1】:

我看不到你在哪里看过data.length. 是否有可能data.length 大于sentBytes?如果是这样,您的循环应该超过 sentBytes,而不是数据。

基本上,您决定缓冲区缓冲区长度的逻辑似乎与 sentBytes 的大小不一致。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 2017-10-05
      • 2017-03-23
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多