2013-04-10 36 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)代替。