解码消息时出现ArrayOutOfBoundsException

时间:2013-04-10 19:12:16

标签: java arrays

当我运行以下代码时,我得到一个'数组越界'异常。基本上我将两个TLV编码的字符串从客户端发送到服务器,服务器解码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];
用于解码的TLV类中的

代码

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()]);
}

运行程序时出现以下异常:

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

如果可能的话,我将不胜感激任何帮助调试问题,甚至是解决方案。

2 个答案:

答案 0 :(得分:0)

您正在迭代i < data.length,但之后您尝试访问data[i + 1]data[i + 2]

你应该做

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

答案 1 :(得分:0)

这一行最常见的导致你的例外

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

当计数器(i)到达data.length时,data [i+2]data[i + 1]将超出数组范围。