我正在尝试从响应对象中的db获取数据并在客户端显示它。但我得到这个数组索引超出范围的异常。我相信我做的正确,但只是不能让它运行。 我得到的错误是
java.lang.ArrayIndexOutOfBoundsException: length=1956; index=1956
at com.pda.kaizen.ConnectionImpl.getCustomers(ConnectionImpl.java:139)
at com.pda.kaizen.activity.MainMenuActivity$1.run(MainMenuActivity.java:123)
at java.lang.Thread.run(Thread.java:856)
这是服务器端代码
StringBuilder sb = new StringBuilder();
sb.append("100|OK");
for (Customer customer : customers) {
sb.append("|").append(customer.getId())
.append("|").append(customer.getCode())
.append("|").append(customer.getName())
.append("|").append(customer.getNameFarsi())
.append("|").append(customer.getAddress())
.append("|").append(customer.getType())
.append("|").append(customer.getPhoneNo())
.append("|").append(customer.getMobileNo())
.append("|").append(customer.getFaxNo())
.append("|").append(customer.getEmail())
.append("|").append(customer.getRegisterCode())
.append("|").append(customer.getOrganizationName())
.append("|").append(customer.getEconomicCode())
.append("|").append(customer.getMelliCode())
.append("|").append("-1".equals(customer.getPostCode())?"":customer.getPostCode())
.append("|").append(customer.getFirstName())
.append("|").append(customer.getLastName());
}
return sb.toString();
这是活动代码
@Override
public List<Customer> getCustomers() {
List<NameValuePair> params = new ArrayList<NameValuePair>(1);
params.add(new BasicNameValuePair("action", "customer"));
try {
String response = executeHttpPost(params);
String[] result = response.split(DELIMITER);
List<Customer> customers = new ArrayList<Customer>();
for (int i = 2; i < result.length - 16; i += 17) {
String id = result[i + 0];
String code = result[i + 1];
//String name = result[i + 2];
String name = result[i + 3];
String address = result[i + 4];
String type = result[i + 5];
String phone = result[i + 6];
String mobile = result[i + 7];
String fax = result[i+8];
String email = result[i+9];
String registerCode = result[i+10];
String organizationName = result[i+11];
String economicCode = result[i+12];
String melliCode = result[i+13];
String postCode = result[i+14];
String firstName = result[i+15];
String lastName = result[i+16];
Customer customer = new Customer(id, code, name, address, type,phone,mobile,fax,email,registerCode,organizationName,economicCode,melliCode,postCode,firstName,lastName);
customers.add(customer);
}
return customers;
}
catch (Exception exc) {
Log.e("----", exc.getMessage(), exc);
throw new ConnectionException(exc.getMessage());
}
}
答案 0 :(得分:3)
我可能错了 - 但我相信你的问题在于split
你的字符串。
如果你这样做:"a|b|c".split("\\|")
- 你会得到一个包含3个字符串的数组
如果您执行此操作:"a||".split("\\|")
- 您将获得一个 1 字符串数组。
这是因为split
删除了结尾。
假设您使用的是split
- 请检查您的数据,看看上一位客户是否有姓氏。
如果不是 - 那我就是对的。
请参阅以下ideone代码作为示例: Example of code failing due to empty data
要解决此问题,您应在分隔符(或您希望的任何其他值)之间引入空格,以确保split
将它们考虑在内。
请参阅以下ideone代码作为示例: Example of code running with spaces between delimiters.
注意:引自javadoc
围绕给定正则表达式的匹配拆分此字符串。 此方法的工作方式就像通过调用双参数split方法一样 给定的表达式和一个零的限制参数。 尾随空 因此,字符串不包含在结果数组中。
答案 1 :(得分:2)
数组在java中为零索引,因此对于长度= 1956的数组,使用的最大索引应为myArray[1955]
。当然第一个元素是myArray[0]
答案 2 :(得分:2)
你的for循环退出条件错误,当你得到result[i+16]
时,你应该确定i < result.length - 16
for (int i = 2; i < result.length-16; i += 17) {
答案 3 :(得分:1)
我确信我做得正确
我很确定你不是......一般来说,如果某些东西不像你期望的那样,你应该假设你不做一切都正确。
我强烈怀疑这是问题所在:
for (int i = 2; i < result.length; i += 17)
如果失败是在索引1956,我怀疑问题是确实有1956个元素,代表115个条目从索引1 开始。
所以试试:
for (int i = 1; i < result.length; i += 17)
现在给出您的初始"100|OK"
,我可以看到为什么您希望从索引2开始,但似乎并非如此。如果你没有告诉我们你是如何获得result
的,那也没有帮助 - 也许这已经“吞噬”了一个价值?
您应该在调试器中查看结果,以调查可疑偏移量。
答案 4 :(得分:0)
仔细分析异常。
java.lang.ArrayIndexOutOfBoundsException: length=1956; index=1956
它表示长度为1956,索引为1956.如果数组的长度为1956,则最后一个索引为1955.数组索引从零开始。