【问题标题】:IndexOutOfBoundsException thrown by java.nio bytebuffer.put(byte[] arsrc, int offset , int length)java.nio bytebuffer.put(byte[] arsrc, int offset , int length) 抛出的 IndexOutOfBoundsException
【发布时间】:2011-05-12 23:23:22
【问题描述】:

大家好,希望有人能帮我解决这个问题..

我很好奇为什么我会收到这个运行时错误,而从我的角度来看我不应该 这是代码部分:

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

这是在 LU62XnsCvr 类中对它的任何引用之前声明的整数变量 MGBUFLN

final static int MGBUFLN   = 192 ;    //Message Buffer Length 

这是用作声明为 LU62XnsCvr 类成员变量的“源”的字节数组...

static byte[] mesgwork = new byte[MGBUFLN] ;

这是我从 Oracle Java Doc 网站复制的;不知道具体情况如何,
但它被标记为 java 6 并且我正在运行使用 java 1.6 的 IBM SDK

public ByteBuffer put(byte[] src, int offset, int 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 - 如果这 缓冲区是只读的

我有点担心这些陈述:

否则,此方法复制长度 给定数组中的字节到这个 缓冲区,从给定的开始 数组和当前的偏移量 这个缓冲区的位置。这 然后这个缓冲区的位置是 按长度递增。

然后:

除了它首先检查那里 此缓冲区中有足够的空间,并且 它可能更多 高效。

// * 我的附加 cmets * //

现在我想完全“填充” 192 字节缓冲区(因此索引范围为 0 - 191)
因此,如果文档中提出,缓冲区按长度“增加”
(在这种情况下为 192 字节)

然后在我看来,暗示“逻辑”将向索引添加 192 个字节,并且
低,看……我们超出了索引的范围……

非常感谢任何人对此的意见。
等待您的 cmets 和/或建议...

谢谢

男人

【问题讨论】:

    标签: java arrays bytebuffer indexoutofboundsexception


    【解决方案1】:

    排队

    mesg_bufr.put( mesgwork, bufroffset, MGBUFLN ) ;
    

    您正在尝试将 MGBUFLN(即 192)字节从 mesgwork 字节数组传输到缓冲区。但是您的 mesgwork 数组中只有 89 个字节,这就是为什么您会出现越界异常。

    试试这个:

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

    【讨论】:

    • Hmmmmm ...我曾想过。我终于在网上查到了计算的 checkBounds() 方法做了三个
    【解决方案2】:

    mesgwork 是一个数组,包含的元素少于bufroffset + MGBUFLN

    由于您使用 size = MGBULFN 初始化数组,因此我假设您的 bufferoffset 必须始终为 0 才能使其正常工作。

    除此之外 - MGBULFN 是一个相当神秘的常量名称。考虑重命名它。

    【讨论】:

    • 嗨 Bozho ...谢谢你的支持,但我必须说,自从我一直在使用这个网站以来,你们中的大多数 javalistas 都对“短”标签(在 8 & 12 个字节),我觉得这很有趣,因为我会赌一美元,99.9999% 的你们中的 99.9999% 都用非常简洁和“神秘”的诗句在“传播者”上发短信。如果您足够聪明,可以弄清楚“短信”中使用的“速记”,那么 8 到 12 字节的变量标签肯定不会给您带来任何问题..
    猜你喜欢
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多