IndexOutOfBoundsException throw java.nio 의 bytebuffer.을 넣어(byte[]arsrc,int offset,int length)
-
12-11-2019 - |
문제
안녕하세요 모든 사람이 나를 도울 수 있는 이 문제를 해결..
나는 이유에 대한 호기심어요 이 경우 런타임 오류 나의 관점에서 말 여기에는 코드 섹션:
// 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)
여기에서의 변수 MGBUFLN 선언하기 전에는 모든 대한 참조를 이내에 LU62XnsCvr 클래스
final static int MGBUFLN = 192 ; //Message Buffer Length
여기에는 바이트 배열로 사용되는"소스"으로 선언 LU62XnsCvr 클래스의 구성원 변수...
static byte[] mesgwork = new byte[MGBUFLN] ;
이 복사에서 오라클 Java Doc 웹사이트;하지 않는 방법을 정확히 알고 현재 그것은,
그러나 그것으로 표시 java6 나는 실행하는 IBM 의 SDK 사용하는 java1.6
공공의 bytebuffer 넣어(byte[]src,int offset,int length)
상대의 대량 방법을 넣어(옵션 운영).이 방법송 바이트로 이 버퍼에서 지정 소스 배열입니다.많은 경우 바이트로 복사할 배열에서 이상 남아이 버퍼는 경우 길이>나머지(),바이트가 사용되지 않습니다 다음 전송 및 BufferOverflowException 가 발생합니다.그렇지 않으면,이 방법을 사본 길이 바이트로부터 주어진 배열이 버퍼에서 시작,주어진 오프셋에서 편안하고 현재 의 위치를 이 버퍼입니다.이 의 위치를 이 버퍼런 다음 증가에 의한 길이 있습니다.에서 다른 단,호출하는 이 방법 양식
dst.put(src, off, len)
가 정확히 동일한 효과로는 루프for (int i = off; i < off + len; i++) dst.put(a[i]);
것을 제외하고 그것을 먼저 확인하는 거기에 에 충분한 공간이 완충기와 그 은 잠재적으로 훨씬 더 많은 효율적이다.
Parameters:
- src-배열에서 는 바이트를 읽
- 오프셋 오프셋에서의 배열 첫 번째 바이트를 읽을 수 있;야 non-부정적인 것보다 더 큰 배열입니다.길이
- 길이의 수 바이트에서 읽어야 하는 주어진 배열음수가 아니어야 합 크 보다 배열입니다.길이-오프셋
을 반환합니다.이 버퍼
Throws:
- BufferOverflowException-이 있는 경우 불충분한 공간에서 이 버퍼
- IndexOutOfBoundsException-If the 전제 조건에서의 오프셋과 길이 매개 변수하지 않을 개최
- ReadOnlyBufferException-이 버퍼에 읽기 전용
나는 작은 관심은 문구:
그렇지 않으면,이 방법을 사본 길이 바이트로부터 주어진 배열이 버퍼에서 시작,주어진 오프셋에서 편안하고 현재 의 위치를 이 버퍼입니다.이 의 위치를 이 버퍼런 다음 증가에 의한 길이 있습니다.
그리고:
것을 제외하고 그것을 먼저 확인을 거 충분한 공간에서 이 버퍼 그것은 잠재적으로 훨씬 더 효율적입니다.
// *내 추가적인 코멘트* //
지금 내가 원하는 완전히 채우기""192 바이트 버퍼(index 따라서 범위는 0 에서-191)
그렇다면으로 앞으로 두 문서,버퍼는"증가하는"길이
(192 바이트 이 경우)
그것은 나에게 나타나 묵시적으로는"로직"가 추가 192 개의 바이트 인덱스
낮은 보라...우리는 경계에서 index...
나는 정말 사람의 의견을니다.
귀하의 의견을 기다리고 있 및/또는 제안이...
감사
남자
해결책
라인
mesg_bufr.put( mesgwork, bufroffset, MGBUFLN ) ;
.
MESGWORK 바이트 배열에서 MESGWORK 바이트 배열에서 MESGBUFLN (IE 192) 바이트를 버퍼로 전송하려고합니다.그러나 Mesgwork Array에는 89 바이트 만 있습니다. 이는 경계를 벗어나는 것입니다.
시도 :
mesg_bufr.put( mesgwork, bufroffset, mesgwork.length ) ;
. 다른 팁
mesgwork
는 bufroffset + MGBUFLN
보다 적은 요소를 포함하는 배열입니다
size= MGBULFN
로 배열을 초기화 한 후 bufferoffset
가이 작업이 작동하려면 항상 0이어야합니다.
그 외에도 - MGBULFN
는 일정한 암호화 이름입니다.그것의 이름을 바꾸는 것을 고려하십시오.