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 つの文字列の配列が得られます。
これを行う場合: "a||".split("\\|")- 1 つの文字列の配列を取得します。

これはsplit、端をトリミングするためです。

使用していると仮定してsplit、データをチェックし、最後の顧客に姓があるかどうかを確認します。いいえの場合、私は正しいです。

サンプルとして次の ideone コードを参照してください: 空のデータが原因で失敗するコードの例

この問題を解決するには、区切り文字 (または必要なその他の値) の間にスペースを挿入splitして、それらが考慮されるようにする必要があります。

例として、次の ideone コードを参照してください

注: javadocからの引用

指定された正規表現の一致に基づいてこの文字列を分割します。このメソッドは、指定された式とゼロの制限引数を使用して 2 引数の split メソッドを呼び出すかのように機能します。したがって、後続の空の文字列は、結果の配列には含まれません。

于 2012-10-02T09:06:53.630 に答える
2

配列はJavaでゼロインデックス化されているため、length = 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 で発生した場合、インデックス 1 から始まる115 のエントリを表す正確に 1956 個の要素があることに問題があると思われます。

だから試してみてください:

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

これでイニシャル が与えられたので、インデックス 2 から開始することを期待する理由"100|OK"がわかりましたが、そうではないようです。どのように取得しているかを示していないことは役に立ちません。おそらく、1 つの値を既に「飲み込んでいる」のではないでしょうか?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 に答える