2011-05-12 1 views
-1

Привет всем Я надеюсь, что кто-то может помочь мне решить эту проблему ..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

ответ

0

В строке

mesg_bufr.put(mesgwork, bufroffset, MGBUFLN) ; 

вы пытаетесь передать MGBUFLN (т.е. 192) байт из массива mesgwork байт в буфер. Но ваш массив mesgwork имеет только 89 байтов, поэтому вы получаете исключение из пределов.

попробовать это:

mesg_bufr.put(mesgwork, bufroffset, mesgwork.length) ; 
+0

Хммммм ... Я подумал об этом. Я, наконец, выследил в Интернете метод checkBounds(), который вычисляет три –

0

mesgwork представляет собой массив, который содержит меньше элементов, чем bufroffset + MGBUFLN

Поскольку вы инициализировать массив с размером = MGBULFN , то я бы предположил, что ваш bufferoffset должен всегда 0, чтобы это работало.

Кроме того - MGBULFN - довольно загадочное имя для константы. Подумайте о переименовании.

+0

Привет Bozho ... спасибо вам asnwer, я должен сказать, однако, что, так как я использую этот сайт, большинство из вас javalistas имеет какое-то предубеждение против «короткого «Ярлыки (между 8 и 12 байтами), я нахожу это забавным, потому что я поставил доллар, 99,9999% вашего текста на ваших« коммуникаторах »в очень кратком и« загадочном »стихе. Если вы достаточно умны, чтобы понять «короткую руку», используемую в «texting», SURELY с переменной меткой от 8 до 12 байтов не должно вызывать никаких проблем. –

Смежные вопросы