ArrayIndexOutOfBounds从数据库获取数据时的异常问题

时间:2012-10-02 08:41:29

标签: java android database exception

我正在尝试从响应对象中的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());
    }
}

5 个答案:

答案 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.数组索引从零开始。