大家好,我希望有人可以帮我解决这个问题。
我很好奇为什么从我的角度来看我不应该得到这个运行时错误 这是代码部分:
// 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个字节和
瞧不起......我们已经超出了指数......
我真的很感激任何人对此的看法 等待你的意见和/或建议......
谢谢
盖
答案 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 ) ;