0

我正在尝试从响应对象中的数据库获取数据并将其显示在客户端。但是我让这个数组索引超出了界限异常。我确信我做对了,但不能让它运行。我得到的错误是

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

5 回答 5

3

我可能错了 - 但我相信你的问题在于你split的字符串。

如果你这样做:"a|b|c".split("\\|")- 你会得到一个由 3 个字符串组成的数组。
如果你这样做: - 你会得到一个包含1 个字符串"a||".split("\\|")的数组。

这是因为split修剪了末端。

假设您正在使用split- 检查您的数据并查看最后一位客户是否有姓氏。如果没有 - 那么我是正确的。

请参阅以下 ideone 代码作为示例: 由于空数据导致代码失败的示例

要解决此问题,您应该在分隔符(或您希望的任何其他值)之间引入空格,以确保split将它们考虑在内。

请参阅以下 ideone 代码作为示例: 在分隔符之间使用空格运行的代码示例。

注意:引用javadoc

围绕给定正则表达式的匹配拆分此字符串。此方法的工作方式就像通过使用给定表达式和零限制参数调用双参数拆分方法一样。因此,尾随的空字符串不包含在结果数组中。

于 2012-10-02T09:06:53.630 回答
2

数组在 java 中的索引为零,因此对于长度 = 1956 的数组,使用的最大索引应该是myArray[1955]. 当然,第一个元素是myArray[0]

于 2012-10-02T08:46:29.950 回答
2

你的 for 循环退出条件是错误的,当你得到result[i+16]你应该确定i < result.length - 16

for (int i = 2; i < result.length-16; i += 17) {
于 2012-10-02T08:49:25.410 回答
1

我确定我做对了

我很确定你不是……一般来说,如果某些事情的行为不像你期望的那样,你应该从假设你没有正确地做所有事情开始。

我强烈怀疑这是问题所在:

for (int i = 2; i < result.length; i += 17)

如果故障发生在索引 1956,我怀疑问题在于正好有 1956 个元素,代表从索引 1 开始的115 个条目。

所以试试:

for (int i = 1; i < result.length; i += 17)

现在给定您的初始值"100|OK",我可以理解为什么您希望从索引 2 开始,但似乎情况并非如此。你没有向我们展示你是如何得到的,这并没有帮助result——也许这已经“吞噬”了一个价值?

您应该真正查看调试器中的结果以调查可疑偏移量。

于 2012-10-02T08:48:29.753 回答
0

仔细分析异常。

java.lang.ArrayIndexOutOfBoundsException: length=1956; index=1956

它说长度是 1956,索引是 1956。如果数组的长度是 1956,最后一个索引应该是 1955。数组索引从零开始。

于 2012-10-02T08:48:59.093 回答