2011-05-12 100 views
-1

您好所有我希望有人能幫助我解決這個問題。至於爲什麼我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個字節到索引和
低和看哪......我們超出索引的範圍...

我真的很感激任何人對此的看法。
等待您的意見和/或建議...

感謝

蓋伊

回答

0

在線路

mesg_bufr.put(mesgwork, bufroffset, MGBUFLN) ; 

你正在試圖傳送MGBUFLN(即192)從mesgwork字節數組緩衝區的字節。但是你的mesgwork數組裏只有89個字節,這就是爲什麼你得到越界異常。

試試這個:

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

嗯......我曾考慮過這個問題。我終於在互聯網上追蹤了checkBounds()方法,它計算三個 – 2011-05-12 23:58:58

0

mesgwork是包含比bufroffset + MGBUFLN

更少的元素既然你初始化大小的數組的數組= MGBULFN ,那麼我會假設您的bufferoffset必須始終爲0才能使其工作。

除此之外 - MGBULFN是一個常數相當神祕的名字。考慮重命名它。

+0

嗨Bozho ...感謝你asnwer,我必須要說不過,既然我一直在使用這個網站,你最javalistas有某種偏見反對「短「標籤(8和12字節之間),我覺得這很有趣,因爲我會下注一美元,99.9999%的人在你的」傳播者「上以非常簡潔和」神祕「的方式發表文章。如果你足夠聰明地找出「短信」中使用的「短手」,那麼一個8-12字節的變量標籤應該沒有問題。 – 2011-05-13 00:22:41