1

非常に奇妙な例外が発生しました。ここではうまく動作しますが、私の顧客はこの例外に遭遇し続けてクラッシュします。それを理解するのに何時間もかかりましたが、残念ながら今のところまだ運がありません。助けていただければ幸いです。

これはコードです:

protected void onPostExecute(List<File> result) {
    try {
        mBooks.clear();
        if (result != null) {
            ArrayList<BookInfo> newBooks = new ArrayList<BookInfo>();
            for (File f : result) {
                BookInfo bi = new BookInfo(BookCollections.this, f);
                if (!contains(bi)) {
                    newBooks.add(bi);
                }
            }
            mDB.insertBooks(newBooks);
            mBooks.addAll(newBooks);
            new AlertDialog.Builder(BookCollections.this)
                    .setTitle(newBooks.size() + " Books found!")
                    .setPositiveButton(android.R.string.ok, null)
                    .setView(
            new BookInfoList(BookCollections.this,
            newBooks)).show();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        mScanDlg.dismiss();
        notifyDataSetChanged();
    }
}

private boolean contains(BookInfo bi) {
    if (bi == null) {
        return true;
    }
    for (BookInfo book : mBooks) {
        if (book.equalTo(bi)) {
            return true;
        }
    }
    for (FolderInfo fi : mFolders) {
        if (fi.getBooks() != null) {
            for (BookInfo book : fi.getBooks()) {
                if (book.equalTo(bi)) {
                    return true;
                }
            }
        }
    }
    return false;
}

私を助けてください。ありがとう

この例外(java.lang.ArrayIndexOutOfBoundsException)は、

for (File f : result) {
    BookInfo bi = new BookInfo(BookCollections.this, f);
    if (!contains(bi)) {
        newBooks.add(bi);
    }
}
4

4 に答える 4

3

メソッド名がonPostExecuteであることに気づきました。これはWebリクエストを処理するメソッドでしょうか?その場合、顧客がこのコードを実行すると、マルチスレッドのWebコンテナで実行されている可能性があります。ただし、コレクションArrayListはスレッドセーフなコレクションではありません。これが、開発(シングルスレッド)環境では機能するが、ビジー状態のサーバーでは機能しない理由である可能性があります。

Collections.synchronizedList()メソッドを使用してArrayListをインスタンス化することを検討してください。同期ブロック内での反復に関するAPIドキュメントのアドバイスに必ず従ってください。

于 2012-07-14T05:28:50.337 に答える
0

エミュレーターアプリがパーファクトデータを表示する数日前に直面したのと同じ奇妙な動作ですが、デバイスではArraylistと同じ概念のエラーが表示されます。私の提案は、PostExecuteから、 この前にコンテンツを追加していない場合はこの行を削除することです。 ArrayList mBooks

mBooks.clear();  // remove this line 

プロジェクトをビルドしてクリーンアップすると、別のarraylistで同じ問題が発生し、このように整理されます。

はい、あなたは正しいですあなたのエラーはこれで来ます

 for (File f : result) {
                        BookInfo bi = new BookInfo(BookCollections.this, f);
                        if (!contains(bi)) {
                            newBooks.add(bi);
                        }
                    }

まず、Logasで配列リストのサイズを確認します

   Log.d("Size",""+newBooks.size());

それがあなたの配列を感じるよりも0より大きい場合、もう1つは

containsメソッドによる戻りデータがfalseの場合、条件データがnewBooks配列に挿入された場合、メソッドにbczが含まれるように変更する 、常にブール値がtrueになると思います。 そのため、このチェックでは

としてログイン

Log.d("BooleanValue",""+newBooks.size());

この前に 、ログ出力から(!contains(bi))条件があれば、データがArraylistに挿入されているか、条件が満たされていないかを確認できます。

于 2012-07-14T05:35:47.613 に答える
0

ArrayIndexOutOfBoundsExceptionこれは最終的にはで生成される普通であることがわかります

BookInfo bi = new BookInfo(BookCollections.this, f);

境界を超えるインデックスを持つ別のfor句があるためです。

于 2012-07-15T13:39:37.990 に答える
0
  1. 「mBooks.clear();」があるので onPoseExecute()の最初の行で、ステートメント

    for (BookInfo book : mBooks) {  
        if (book.equalTo(bi)) {  
            return true;  
        }  
    }
    

    contains()意味がないようです。

  2. 「FoldInfofi」に関連する本は外で変更されませんか?

    for (FolderInfo fi : mFolders) {  
            if (fi.getBooks() != null) {  
                for (BookInfo book : fi.getBooks()) {  
                    if (book.equalTo(bi)) {  
                        return true;  
                    }  
                }  
            }  
        }
    

    私は以下のコードがより良いかもしれないと思います:

    for (FolderInfo fi : mFolders) {  
        ArrayList<BookInfo> books = fi.getBooks();  
        if (books  != null) {  
            for (BookInfo book : books) {  
                if (book.equalTo(bi)) {  
                    return true;  
                }  
            }  
        }  
    }  
    
  3. AsyncTaskを使用していて、一部のコード(この実行後ではない)が異なるスレッドで実行されているため、を保護するためにいくつかのロックを使用することを検討することをお勧めmBooksmFoldersますmDB

于 2012-07-16T01:10:00.093 に答える