2013-04-10 54 views
0

当我运行以下代码时,出现'数组越界'异常。基本上我从客户端发送两个TLV编码的字符串到服务器,服务器解码TLV编码的值并将它们打印到屏幕上。ArrayOutOfBoundsException解码消息时

an error has occurred 
java.lang.ArrayIndexOutOfBoundsException: 1 
at ServerConnection.run(Server.java: 131) 
At java.lang.Thread.run(Unknown Source) 

我将不胜感激:当我运行该程序

代码来打印解码值

在TLV类
byte[] from_ca = new byte[65536]; 
int msg = is.read(from_ca, 0, 65536); 
from_ca = Arrays.copyOfRange(from_ca, 0, msg); 
Object[] decodeBytes = TLV.decode(from_ca); 

String ca_id = (String) decodeBytes[0]; 
String cb_id = (String) decodeBytes[1]; 

码解码

public static Object[] decode(byte[] data) throws Exception { 
    int i = 0; 
    List<Object> tlvList = new ArrayList<Object>(); 
    while (i < data.length) { 
     if (data[i] == TLV.ascii) { 
      int length = (256 * data[i + 2]) + data[i + 1]; 
      tlvList.add(new String(Arrays.copyOfRange(data, i + 3, i + 3 + length), "US-ASCII")); 
      i = i + 3 + length; 

     } else if (data[i] == TLV.integer) { 
      int length = (256 * data[i + 2]) + data[i + 1]; 
      tlvList.add(Integer.parseInt(new String(Arrays.copyOfRange(
      data, i + 3, i + 3 + length), "US-ASCII"))); 
      i = i + 3 + length; 

     } else if (data[i] == TLV.binary) { 
      int length = (256 * data[i + 2]) + data[i + 1]; 
      tlvList.add(Arrays.copyOfRange(data, i + 3, i + 3 + length)); 
      i = i + 3 + length; 

     } 
    } // end of loop 
    return tlvList.toArray(new Object[tlvList.size()]); 
} 

我得到下面的异常任何帮助进一步调试问题或者甚至如果可能的话解决方案。

+5

哪一行是Server.java的第131行? – craig65535 2013-04-10 19:14:21

+0

请编辑您的代码以更易于缩进。目前阅读非常困难。 (顺便说一下,为什么在构造字符串时复制字节数组?)只需使用重载的String构造函数,它可以指定起始索引。) – 2013-04-10 19:18:31

+0

看起来,当您尝试复制数组范围时,“i + 3”或“我+ 3 +长度”超出范围。为此添加一个验证,以考虑计算索引或数组长度的最小值。 – devang 2013-04-10 19:19:28

回答

0

大多数probaby此行令你异常

int length = (256 * data[i + 2]) + data[i + 1]; 

当计数器(i)达到data.length然后data [i+2]data[i + 1]将超过数组范围。

+0

我应该补充,该程序打印'字符串ca_id =(字符串)decodeBytes [0];'没有问题,这是当我尝试访问decodeBytes [1];'我得到了例外。 – user1896168 2013-04-10 19:55:33

+0

@ user1896168我试图重现你的问题,我看到一切都好。可能性可能是你传递'data'或者方法返回的值可能导致这个问题。看看'decodeBytes.length'是否包含返回的数据。 – Smit 2013-04-10 22:45:40

+0

我接受你的答案,因为它是唯一给予任何建设性的答案......我仍然没有发现问题,但我期望它从函数返回的数组有问题。 – user1896168 2013-04-11 08:14:26

0

您正在重复达到i < data.length,但您尝试访问data[i + 1]data[i + 2]

你应该做

while (i < data.length - 2)代替。