您好所有我希望有人能幫助我解決這個問題。至於爲什麼我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個字節到索引和
低和看哪......我們超出索引的範圍...
我真的很感激任何人對此的看法。
等待您的意見和/或建議...
感謝
蓋伊
嗯......我曾考慮過這個問題。我終於在互聯網上追蹤了checkBounds()方法,它計算三個 – 2011-05-12 23:58:58