0

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

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

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

相对批量 put 方法(可选操作)。此方法将字节从给定的源数组传输到此缓冲区。如果要从数组复制的字节数多于此缓冲区中的剩余字节数,即如果 length > remaining(),则不传输任何字节并抛出 BufferOverflowException。否则,此方法将给定数组中的长度字节复制到此缓冲区中,从数组中的给定偏移量和此缓冲区的当前位置开始。然后这个缓冲区的位置按长度递增。换句话说,对表单的这个方法的调用dst.put(src, off, len)与循环的效果完全相同

 for (int i = off; i < off + len; i++)
     dst.put(a[i]);

除了它首先检查此缓冲区中是否有足够的空间并且它可能更有效。

参数:

  • src - 要从中读取字节的数组
  • offset - 要读取的第一个字节在数组中的偏移量;必须为非负且不大于 array.length
  • length - 要从给定数组中读取的字节数;必须为非负且不大于 array.length - 偏移量

返回:这个缓冲区

抛出:

  • BufferOverflowException - 如果此缓冲区中没有足够的空间
  • IndexOutOfBoundsException - 如果 offset 和 length 参数的先决条件不成立
  • ReadOnlyBufferException - 如果此缓冲区是只读的

我有点担心这些陈述:

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

进而:

除了它首先检查此缓冲区中是否有足够的空间并且它可能更有效。

// * 我的附加评论 * //

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

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

我真的很感谢任何人对此的看法。
等待您的意见和/或建议...

谢谢

盖伊

4

2 回答 2

0

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

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

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

于 2011-05-12T23:32:14.573 回答
0

在行

mesg_bufr.put( mesgwork, bufroffset, MGBUFLN ) ;

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

试试这个:

mesg_bufr.put( mesgwork, bufroffset, mesgwork.length ) ;
于 2011-05-12T23:44:31.177 回答