IndexOutOfBoundsException异常(字节[] arsrc,诠释抵消,诠释长度)

问题描述:

您好所有我希望有人能帮助我解决这个问题。至于为什么我IndexOutOfBoundsException异常(字节[] arsrc,诠释抵消,诠释长度)

我很好奇m如果此运行时错误时,从我的角度,我不应该 这里的代码段:

// 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=[[email protected] 

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类内的任何参考IT方面整数变量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

公共字节缓冲区放(字节[] SRC,诠释抵消,诠释长度)

相对散装放入方法(可选 操作)。此方法将 字节从给定的 源数组传输到此缓冲区。如果有更多 字节要从阵列中复制而不是 保留在此缓冲区中,也就是说,如果 长度> remaining(),则不传输字节 ,并且会抛出BufferOverflowException引发 。 否则,此方法会将给定数组中的长度为 的字节复制到此缓冲区中的 缓冲区,从此阵列中给定的 偏移量和此缓冲区的当前位置 开始。该缓冲区的 位置然后是 递增长度。在其它 也就是说, 此方法的调用的形式dst.put(src, off, len)具有 完全相同环路

for (int i = off; i < off + len; i++) 
    dst.put(a[i]); 

不同之处在于它首先检查存在该缓冲器 足够的空间相同的效果,它 是潜在的效率更高。

参数:

  • src - 要从 阵列,字节将要被读取
  • 偏移 - 的 第一个字节的数组中的偏移量被读取;必须为 非负数且不大于 array.length
  • length - 要从给定数组读取的 字节的数量; 必须是非负数,并且不能比数组大 。长度 - 偏移

返回:此缓冲区

抛出:

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

我有点关心语句:

否则,此方法复制长度从给定阵列到此 缓冲器 字节,开始于给定 偏移量在该阵列中,并在当前的 这个缓冲区的位置。该缓冲区的 位置然后是 递增长度。

然后:

不同之处在于它首先检查有 此缓冲区足够的空间和 这样可能更有效 。

// *我的补充意见* //

现在我要彻底 “补” 的192字节的缓冲区(因此指数范围从0 - 191)
所以如果作为提出在doc,缓冲器是由长度“递增”
(在这种情况下192个字节)

然后看来,我暗示的“逻辑”是要添加192个字节到索引和
低和看哪......我们超出索引的范围...

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

感谢

盖伊

在线路

mesg_bufr.put(mesgwork, bufroffset, MGBUFLN) ; 

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

试试这个:

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

嗯......我曾考虑过这个问题。我终于在互联网上追踪了checkBounds()方法,它计算三个 – 2011-05-12 23:58:58

mesgwork是包含比bufroffset + MGBUFLN

更少的元素既然你初始化大小的数组的数组= MGBULFN ,那么我会假设您的bufferoffset必须始终为0才能使其工作。

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

+0

嗨Bozho ...感谢你asnwer,我必须要说不过,既然我一直在使用这个网站,你最javalistas有某种偏见反对“短“标签(8和12字节之间),我觉得这很有趣,因为我会下注一美元,99.9999%的人在你的”传播者“上以非常简洁和”神秘“的方式发表文章。如果你足够聪明地找出“短信”中使用的“短手”,那么一个8-12字节的变量标签应该没有问题。 – 2011-05-13 00:22:41