Привет всем Я надеюсь, что кто-то может помочь мне решить эту проблему ..IndexOutOfBoundsException брошенной java.nio bytebuffer.put (байт [] arsrc, Int смещения, внутр длина)
мне очень интересно, почему я м получаю эту ошибку во время выполнения, когда с моей точки зрения, я не должен вот участок кода:
// 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)
здесь» s целая переменная MGBUFLN объявлена до какой-либо ссылки на него в LU62XnsCvr класса
final static int MGBUFLN = 192 ; //Message Buffer Length
вот массив, который используется в качестве «источника» объявлен в качестве переменной-члена LU62XnsCvr класса ...
static byte[] mesgwork = new byte[MGBUFLN] ;
Это Я скопировал с веб-сайта Oracle Java Doc; не знаю точно, как ток это,
но он помечен как Java 6, и я бегу SDK IBM, который использует Java 1.6
общественного ByteBuffer поставил (байт [] ЦСИ, внутр смещение, внутр длина)
Относительный метод навалом (опционально ). Этот метод переносит байты в этот буфер из заданного массива источников . Если в этом буфере содержится больше байтов, то в этом буфере остаются , то есть, если 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 - если этобуфер только для чтения
Я немного обеспокоен с заявлениями:
В противном случае эта длина метод копирует байт из заданного массива в этот буфер, начиная с данный смещение в массиве и в текущем положении этого буфера. Положение этого буфера затем , увеличиваемое по длине.
, а затем:
за исключением того, что он сначала проверяет, что достаточно места в этом буфере и это потенциально гораздо более эффективным.
// * мои дополнительные комментарии * //
Теперь я хочу, чтобы полностью «заполнить» 192 байт буфера (поэтому индекс в диапазоне от 0 - 191)
Таким образом, если, как простер в док, буфер «увеличивается» длиной
(192 байт в данном случае)
, то мне кажется, косвенно «логика» собирается добавить 192 байт индексировать и
низко- и вот ... мы за пределами индекса ...
Я бы очень признателен за чье-то мнение по этому поводу.
Жду ваших комментариев и/или предложений ...
Благодаря
Guy
Хммммм ... Я подумал об этом. Я, наконец, выследил в Интернете метод checkBounds(), который вычисляет три –