大家好,我希望有人可以帮助我解决这个问题..
我很好奇为什么我会收到这个运行时错误,从我的角度来看,我不应该是这里的代码部分:
// 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 并且我正在运行使用 java 1.6 的 IBM 的 SDK
public ByteBuffer put(byte[] src, int offset, int length)
相对批量 put 方法(可选操作)。此方法将字节从给定的源数组传输到此缓冲区。如果要从数组复制的字节数多于此缓冲区中的剩余字节数,即如果 length > remaining(),则不传输任何字节并抛出 BufferOverflowException。否则,此方法将给定数组中的长度字节复制到此缓冲区中,从数组中的给定偏移量和此缓冲区的当前位置开始。然后这个缓冲区的位置按长度递增。换句话说,对表单的这个方法的调用
dst.put(src, off, len)
与循环的效果完全相同for (int i = off; i < off + len; i++) dst.put(a[i]);
除了它首先检查此缓冲区中是否有足够的空间并且它可能更有效。
参数:
- src - 要从中读取字节的数组
- offset - 要读取的第一个字节在数组中的偏移量;必须为非负且不大于 array.length
- length - 要从给定数组中读取的字节数;必须为非负且不大于 array.length - 偏移量
返回:这个缓冲区
抛出:
- BufferOverflowException - 如果此缓冲区中没有足够的空间
- IndexOutOfBoundsException - 如果 offset 和 length 参数的先决条件不成立
- ReadOnlyBufferException - 如果此缓冲区是只读的
我有点担心这些陈述:
否则,此方法将给定数组中的长度字节复制到此缓冲区中,从数组中的给定偏移量和此缓冲区的当前位置开始。然后这个缓冲区的位置按长度递增。
进而:
除了它首先检查此缓冲区中是否有足够的空间并且它可能更有效。
// * 我的附加评论 * //
现在我想完全“填充” 192 字节缓冲区(因此索引范围为 0 - 191)
所以如果在文档中提出,缓冲区“增加”长度
(在这种情况下为 192 字节)
然后在我看来,暗示“逻辑”将在索引中添加 192 个字节,
然后看……我们超出了索引的范围……
我真的很感谢任何人对此的看法。
等待您的意见和/或建议...
谢谢
盖伊