java.nio bytebuffer.put抛出的IndexOutOfBoundsException(byte [] arsrc,int offset,int length)

时间:2011-05-12 23:23:22

标签: java arrays bytebuffer indexoutofboundsexception

大家好,我希望有人可以帮我解决这个问题。

我很好奇为什么从我的角度来看我不应该得到这个运行时错误 这是代码部分:

// Send Message to the Message Log 

public static void SendMesg() 
   {   
      String mesg_str = message_data.toString() ;        
      int msgstr_len = mesg_str.length();            // determine actual message length
      int array_len  = mesgwork.length ;     // determine actual mesgwork array length
      dt_stamp = getDateTime() ; 
      System.out.println(dt_stamp) ; 
      System.out.println( " LU62XnsCvr Diagnostic:");
      System.out.println(" LU62XCI0100: Method = SendMesg") ; 
      System.out.println(" Message to be sent: " ) ;
      System.out.println(mesg_str) ;
      System.out.println("mesg_str Length=") ;
      System.out.println(msgstr_len) ; 
      System.out.println("Derived mesgwork Length=") ;
      System.out.println(array_len) ; 
      System.out.println("Class Var MGBuffer length value: ") ;
      System.out.println(MGBUFLN) ; 
      System.out.println("Buffer Offset Value=") ;
      System.out.println(bufroffset) ;
      System.out.println( " LU62XnsCvr End Diagnostic") ;

      mesgwork = mesg_str.getBytes() ;        //Convert msg string to byte array 
      mesg_bufr.put( mesgwork, bufroffset, MGBUFLN ) ;// <= error occurs here  
      pgm_cntl = WRITE_MESG ;
      FileControl() ; 
      if (pgm_cntl == WRITE_ERROR) 
        { 
         sys_return = pgm_cntl ;
         SysEnd( sys_return ) ;
        }
      mesgcount = mesgcount + 1 ;                    // increment the message counter
      mesg_bufr.clear() ; 
      message_data.append("                ")  ;     // 16 bytes of blanks
      clearByteArray( mesgwork, MGBUFLN ) ;

   }  // End of Send Message log write sub-routine 

这是我运行程序时显示的内容:

2011.05.12 10:48:07    
LU62XnsCvr Diagnostic:  

 LU62XCI0100: Method = SendMesg
 Message to be sent:2011.05.12 10:48:07 LU62XCE0313: CPIC Return Code =1 CM Alloc  ConversationID=[B@201d201d  

mesg_str Length=89  

Derived mesgwork Length=192  

Class Var MGBuffer length value:192  

Buffer Offset Value=0  

 LU62XnsCvr End Diagnostic  


Exception in thread "main" java.lang.IndexOutOfBoundsException
        at java.nio.Buffer.checkBounds(Buffer.java:543)
        at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:177)
        at APPC_LU62.Runtime.LU62XnsCvr.SendMesg(LU62XnsCvr.java:652)
        at APPC_LU62.Runtime.LU62XnsCvr.StartConvrs(LU62XnsCvr.java:517)
        at APPC_LU62.Runtime.LU62XnsCvr.ProcessRqsts(LU62XnsCvr.java:398)
        at APPC_LU62.Runtime.LU62XnsCvr.main(LU62XnsCvr.java:357)

这是在LU62XnsCvr类中引用它之前声明的整数变量MGBUFLN

final static int MGBUFLN   = 192 ;    //Message Buffer Length 

这里是用作声明为LU62XnsCvr类成员变量的“源”的字节数组......

static byte[] mesgwork = new byte[MGBUFLN] ;

这是我从Oracle Java Doc网站复制的;不确切知道它的当前状态,
但它标记为java 6,我正在运行IBM的SDK,它使用的是java 1.6

  

public ByteBuffer put(byte [] src,int offset,int length)

     

相对批量放置方法(可选   操作)。这种方法转移   从给定的字节到这个缓冲区   源数组。如果有更多   要从数组中复制的字节数   保留在此缓冲区中,即if   长度>剩余(),然后没有字节   转移和a   抛出BufferOverflowException。   否则,此方法复制长度   从给定数组到此的字节数   缓冲,从给定的开始   数组和当前的偏移量   这个缓冲区的位置。该   那么这个缓冲区的位置   按长度递增。其他   单词,这种方法的调用   形式dst.put(src, off, len)有   与循环

完全相同的效果
 for (int i = off; i < off + len; i++)
     dst.put(a[i]);
     

除了它首先检查有   在这个缓冲区中有足够的空间   可能会更有效率。

     

参数:

     
      
  • src - 来自的数组   要读取哪些字节
  •   
  • 偏移 -   数组内的偏移量   要读取的第一个字节;一定是   非负面且不大于   array.length
  •   
  • 长度 - 数量   要从给定数组中读取的字节数;   必须是非负面的,不能更大   比array.length - offset
  •   
     

返回:此缓冲区

     

抛出:

     
      
  • BufferOverflowException - 如果有   此缓冲区中的空间不足
  •   
  • IndexOutOfBoundsException - 如果是   偏移量和长度的前提条件   参数不成立
  •   
  • ReadOnlyBufferException - 如果是这样   缓冲区是只读的
  •   

我对这些陈述有点关注:

  

否则,此方法复制长度   从给定数组到此的字节数   缓冲,从给定的开始   数组和当前的偏移量   这个缓冲区的位置。该   那么这个缓冲区的位置   按长度递增。

然后:

  

除了它首先检查那里   在这个缓冲区中有足够的空间   它可能更多   高效。

// *我的其他评论* //

现在我想完全“填充”192字节缓冲区(索引因此范围从0到191) 因此,如文档中所述,缓冲区被“递增”长度
 (在这种情况下为192字节)

然后在我看来暗示“逻辑”将向索引添加192个字节和
 瞧不起......我们已经超出了指数......

我真的很感激任何人对此的看法  等待你的意见和/或建议......

谢谢

2 个答案:

答案 0 :(得分:0)

mesgwork是一个包含的元素少于bufroffset + MGBUFLN

的数组

由于您使用size = MGBULFN初始化数组,因此我假设您的bufferoffset必须始终为0才能使其正常工作。

除此之外 - MGBULFN是常数的一个相当神秘的名称。考虑重命名它。

答案 1 :(得分:0)

在第

mesg_bufr.put( mesgwork, bufroffset, MGBUFLN ) ;

您正在尝试将MGBUFLN(即192)字节从mesgwork字节数组传输到缓冲区。但是你的mesgwork数组只有89个字节,这就是为什么你得到了越界异常。

试试这个:

mesg_bufr.put( mesgwork, bufroffset, mesgwork.length ) ;