IndexOutOfBoundsException throw java.nio 의 bytebuffer.을 넣어(byte[]arsrc,int offset,int length)

StackOverflow https://stackoverflow.com/questions/5985656

문제

안녕하세요 모든 사람이 나를 도울 수 있는 이 문제를 해결..

나는 이유에 대한 호기심어요 이 경우 런타임 오류 나의 관점에서 말 여기에는 코드 섹션:

// 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 ) ;
.

다른 팁

mesgworkbufroffset + MGBUFLN보다 적은 요소를 포함하는 배열입니다

size= MGBULFN로 배열을 초기화 한 후 bufferoffset 가이 작업이 작동하려면 항상 0이어야합니다.

그 외에도 - MGBULFN는 일정한 암호화 이름입니다.그것의 이름을 바꾸는 것을 고려하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top