【发布时间】:2011-05-12 23:23:22
【问题描述】:
大家好,希望有人能帮我解决这个问题..
我很好奇为什么我会收到这个运行时错误,而从我的角度来看我不应该 这是代码部分:
// 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)
相对批量放置方法(可选 手术)。这种方法转移 从给定的字节到这个缓冲区 源数组。如果还有更多 要从数组中复制的字节数 留在这个缓冲区中,也就是说,如果 长度>剩余(),然后没有字节 被转移和一个 抛出 BufferOverflowException。 否则,此方法复制长度 给定数组中的字节到这个 缓冲区,从给定的开始 数组和当前的偏移量 这个缓冲区的位置。这 然后这个缓冲区的位置是 按长度递增。其他 的话,这种方法的调用
dst.put(src, off, len)的表格有 效果和循环一模一样for (int i = off; i < off + len; i++) dst.put(a[i]);除了它首先检查是否存在 这个缓冲区中有足够的空间,它 可能效率更高。
参数:
- src - 来自的数组 要读取哪些字节
- 偏移 - 数组中的偏移量 要读取的第一个字节;一定是 非负且不大于 数组长度
- 长度 - 的数量 要从给定数组中读取的字节; 必须是非负的且不能更大 比 array.length - 偏移量
返回:这个缓冲区
投掷:
- BufferOverflowException - 如果有 该缓冲区空间不足
- IndexOutOfBoundsException - 如果 偏移量和长度的先决条件 参数不成立
- ReadOnlyBufferException - 如果这 缓冲区是只读的
我有点担心这些陈述:
否则,此方法复制长度 给定数组中的字节到这个 缓冲区,从给定的开始 数组和当前的偏移量 这个缓冲区的位置。这 然后这个缓冲区的位置是 按长度递增。
然后:
除了它首先检查那里 此缓冲区中有足够的空间,并且 它可能更多 高效。
// * 我的附加 cmets * //
现在我想完全“填充” 192 字节缓冲区(因此索引范围为 0 - 191)
因此,如果文档中提出,缓冲区按长度“增加”
(在这种情况下为 192 字节)
然后在我看来,暗示“逻辑”将向索引添加 192 个字节,并且
低,看……我们超出了索引的范围……
非常感谢任何人对此的意见。
等待您的 cmets 和/或建议...
谢谢
男人
【问题讨论】:
标签: java arrays bytebuffer indexoutofboundsexception