2012-04-21 10 views
0

IndexOutOfBoundsExceptionをスローするコードでは、非常に厄介な問題があります。病気の詳細を説明し、次のコードの「addTimetableItem」にlogcatポイント:「sortedFridayTimes」Android ArrayListを使用したIndexOutOfBoundsException

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

私はすでに順にソートしている私自身の「タイムテーブルエントリ」オブジェクトを格納するArrayListです。最初に、オブジェクトがあるかどうかを確認するためにサイズがチェックされ、 "insertDay"が実行されてタイトルの新しいテキストビューが作成され、レイアウトに追加されます(これは正常に動作します)。 forループの内部では、arraylistのすべてのオブジェクトをレイアウトに追加することが考えられます。今、私は "addTimetableItem"コードは、それがすでにテストされているように動作することを知っていますが、私の問題は、私はできませんarraylistの最後のオブジェクトを取得するようです。私は

"i<sortedFridayTimes.size()" 

のために実行するだけにforループを宣言した場合、プログラムは正常に動作しますが、私は私がデバッグ、私の変数を見てきたので、存在することがわかっている配列リストの最後のエントリを得ることはありません。上記のように "+1"を追加すると、今はIndexOutOfBoundsExceptionが発生します。なぜそれが本当にわかりません。私が言ったように、私はデバッグしました、そして、私が指摘しようとしているarraylistにエントリが存在することを知っていますが、ただクラッシュします。必要に応じてもっと多くのコードを提供することができますが、誰にも何かアイデアがありますか?

答えて

1
i<sortedFridayTimes.size()+1 

アレイの最後の要素を過ぎてループしています。なぜ+1

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

だから、次のようになります。

for(int i=0; i<sortedFridayTimes.size(); i++) { 
+0

もし私が思ったのは、サイズが2であれば、1から始まり2より小さくなるため、コードが実行されますが、2になると2になりません。したがってコードは実行されません私はリストの2番目の値を欠場するでしょう。ライト? –

+0

0から始まり、N-1で終わります。 –

+0

助けを歓迎し、今すぐ選別しました。 –

1

あなたのループの実行のための最後のループ:

sortedFridayTimes.get(sortedFridayTimes.size())

要素はゼロをインデックス化しているので、これは常に、範囲外となります。

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

+0

私はArrayListでインデックスが1から始まったと思いましたか? –

+0

@JoshSuckling:いいえ、いつも0です。 – Tim

+0

本当にうれしいです。私はそれが1であると思った理由を知りません。とにかく、テストし、働いて、もう一度ありがとう。 –

2

あなたは@ティムズまたは@グラハムの答えを受け入れるべきです、これは単なる補遺です。 size()+1が配列の最後を過ぎていることは間違いありません。

インデックスを使用してすべてのアイテムを正しく取得できない場合は、for-eachループを使用することもできます(使用しているAndroid SDKのバージョンによって異なります)。あなたが指定していないので、私はsortedFridayTimesがクラスTimetableItemのリストであると仮定しています。

ので、この:あなたが実際にどこでもiを使用する必要がない場合は

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

少しクリーナー:

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

が、このなります。

+0

Androidベストプラクティスでは、より効率的なプログラムのために拡張forループを使用することをおすすめします。これは素晴らしい答えです。 – jjNford

+0

賢明な、助言のための喝采。 –

関連する問題