0

IndexOutOfBoundsException をスローするいくつかのコードで非常に厄介な問題が発生しましたが、その理由が本当にわかりません。logcat は、次のコードの「addTimetableItem」を指していますが、これについては詳しく説明していません。

if(sortedFridayTimes.size()>0){
    insertDay("Friday");
    for(int i=1; i<sortedFridayTimes.size()+1;i++){
        addTimetableItem(sortedFridayTimes.get(i));
    }
}

「sortedFridayTimes」は、すでに順番に並べ替えた独自の「Timetable Entry」オブジェクトを含む ArrayList です。最初にサイズがチェックされ、オブジェクトがあるかどうかが確認されます。次に、タイトルの新しいテキストビューを作成してレイアウトに追加する「insertDay」が実行されます (これは正常に機能します..)。for ループ内では、すべてのオブジェクトを arraylist からレイアウトに追加するというアイデアがあります。これで、「addTimetableItem」コードが既にテストされているように機能することがわかりましたが、私の問題は、配列リストから最後のオブジェクトを取得できないように見えることです。for ループを for のみ実行するように宣言すると、

"i<sortedFridayTimes.size()" 

その後、プログラムは正常に実行されますが、変数をデバッグして監視したため、存在することがわかっている配列リストの最後のエントリを取得できません。上記のように「+1」を追加すると、IndexOutOfBoundsException が発生し、その理由が本当にわかりません。私が言ったように、私はデバッグし、私が指そうとしているアレイリストにエントリが存在することを知っていますが、それはただクラッシュします. 必要に応じてさらにコードを提供できますが、誰かアイデアを教えてください。

4

3 に答える 3

2

@Timまたは@Grahamの答えを受け入れる必要があります。これは単なる補遺です。size()+1それらは、配列の終わりを通過することについて正しいです。

インデックスを使用してリストからすべてを適切に取得するのが難しい場合は、for-eachループを使用することもできます(使用しているAndroid SDKのバージョンによって異なります)。指定しないのでsortedFridayTimes、クラスのリストだと思います。TimetableItem

したがって、この:

if(sortedFridayTimes.size()>0){
    insertDay("Friday");
    for(int i=1; i<sortedFridayTimes.size()+1;i++){
        addTimetableItem(sortedFridayTimes.get(i));
    }
}

これになります:

if(!sortedFridayTimes.isEmtpy()){
    insertDay("Friday");
    for(TimetimeItem item : sortedFridayTimes){
        addTimetableItem(item);
    }
}

i実際にどこでも使用する必要がない場合は、少しきれいになります。

于 2012-04-21T19:44:05.190 に答える
1
i<sortedFridayTimes.size()+1

配列の最後の要素を超えてループしています。なぜ+1

N配列に要素がある場合、要素はインデックス0からまでN-1です。

したがって、次のようになります。

for(int i=0; i<sortedFridayTimes.size(); i++) {
于 2012-04-21T19:35:32.013 に答える
1

forループの最後のループは次のように実行されます。

sortedFridayTimes.get(sortedFridayTimes.size())

要素はゼロインデックスであるため、これは常に範囲外になります。

たとえば、配列サイズが「5」の場合、配列内の5つの要素は。であるため、インデックス「5」にアクセスできません0,1,2,3,4

于 2012-04-21T19:36:21.033 に答える