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) ;
mesgwork
是包含比bufroffset + MGBUFLN
更少的元素既然你初始化大小的数组的数组= MGBULFN
,那么我会假设您的bufferoffset
必须始终为0才能使其工作。
除此之外 - MGBULFN
是一个常数相当神秘的名字。考虑重命名它。
嗨Bozho ...感谢你asnwer,我必须要说不过,既然我一直在使用这个网站,你最javalistas有某种偏见反对“短“标签(8和12字节之间),我觉得这很有趣,因为我会下注一美元,99.9999%的人在你的”传播者“上以非常简洁和”神秘“的方式发表文章。如果你足够聪明地找出“短信”中使用的“短手”,那么一个8-12字节的变量标签应该没有问题。 – 2011-05-13 00:22:41
嗯......我曾考虑过这个问题。我终于在互联网上追踪了checkBounds()方法,它计算三个 – 2011-05-12 23:58:58