2011-07-11 10 views
0

プログラム上でランダムなjava.lang.IndexOutOfBoundsExceptionエラーが発生し続けます。 何が間違っていますか? プログラムは正常に実行されますが、実際には長いforループですが、いくつかの要素については、そのエラーが発生しているように見えて、次の要素に進み、正常に動作します。IndexOutOfBoundsException - 時々のみ?

for (int i = 0; i < response.getSegments().getSegmentInfo().size()-1; i++) { 
    reservedSeats = response.getSegments().getSegmentInfo().get(i).getCabinSummary().getCabinClass().get(i).getAmountOfResSeat(); 
    usedSeats = response.getSegments().getSegmentInfo().get(i).getCabinSummary().getCabinClass().get(i).getAmountOfUsedSeat(); 
    System.out.println("Reserved Seats: " + reservedSeats); 
    System.out.println("Used Seats : " + usedSeats); 
} 

このエラーを防ぐにはどうすればよいですか?

+6

にアクセスしたいです配列のルックアップ(実際にはループ本体)を実際に実行するコードを表示します。 –

+0

@Aasmund:コードを追加 – jcotal

+1

IOOB Exceptionはおそらく '.... getCabinClass()。get(i)'の部分で起こっていますか? getSegmentInfo()のサイズを使用できることは何ですか? – Jacob

答えて

1

次の2つの完全に独立Listオブジェクトへのインデックスにiを使用しているように見える:

response.getSegments().getSegmentInfo().get(i) // indexing into response.getSegments().getSegmentInfo() 
.getCabinSummary().getCabinClass().get(i) // indexing into getCabinSummary().getCabinClass() 
.getAmountOfResSeat(); 

は、これは私には間違って見えます。これはとなるのでしょうか?そして、リストはによって返される限り、によって返され、少なくともであることが保証されていますか?

+0

あなたが正しいです、明らかにサイズが異なります。どのようにこれらのリストのそれぞれの要素を取得する必要がありますか? – jcotal

0

それはループヘッダ与え、安全なはずで.get(i)を呼び出し、response.getSegments().getSegmentInfo()が常に同じ大きさの配列を返すと仮定すると(しかし、あなたは、あなたが最後の要素をスキップしていることを知っている?)しかし、しているあなたは.getCabinSummary()と確信して配列getSegmentInfo()と同じ大きさの配列を返しますか? 2つの異なる配列で参照を実行するのに、iを使用していると疑わしいようです。

次の2つの別々のライン(私はここでしかタイプ名を推測している)にループ本体の最初の行を分割できます。そして、あなたがクラッシュを引き起こすのルックアップ表示されます

List<SegmentInfo> segmentInfo = response.getSegments().getSegmentInfo().get(i); 
reservedSeats = segmentInfo.getCabinSummary().get(i).getAmountOfResSeat(); 

+0

あなたは正しいです、明らかにサイズが異なります。どのようにこれらのリストのそれぞれの要素を取得する必要がありますか? – jcotal

+0

@jcotal:あなたがやろうとしていることに依存します。各セグメントごとに、特定のキャビン要約を1つだけ見たいですか?または、各セグメントについて、すべての客室の要約を確認したいですか?後者の場合は、最初のループの内側に新しいループが必要です。 –

1

あなたは、セグメントに関する情報のリストのための指標として、キャビンクラスリストについてiの両方を使用しています。これはあなたの問題の原因のようなにおいをします。

ドメインモデルがわかりませんが、ここでは2つの異なるカウンタが必要になると思います。これは配列で考えたものについては


問題を示すために

リファクタリング、コードを(正しいクラス名に置き換え、種類を推測)

List<SegmentInfo> segmentInfos = response.getSegments().getSegmentInfo(); 

for (int i = 0; i < segmentInfos.size()-1; i++) { 
    // use i to get actual segmentInfo 
    SegmentInfo segmentInfo = segmentInfos.get(i); 
    List<CabinClass> cabinClasses = segmentInfo.getCabinSummary.getCabinClass(); 

    // use i again to get actual cabin class ??? 
    CabinClass cabinClass = cabinClasses.get(i); 

    reservedSeats = cabinClass.getAmountOfResSeat(); 
    usedSeats = cabinClass.getAmountOfUsedSeat(); 

    System.out.println("Reserved Seats: " + reservedSeats); 
    System.out.println("Used Seats : " + usedSeats); 
} 
+0

あなたが正しいです、明らかにサイズが異なります。どのようにこれらのリストのそれぞれの要素を取得する必要がありますか? – jcotal

3

、それは可能性が高いリストです。

私は、ConcurrentModificationExceptionsを取得していたと思いますので、要素のインデックス付き参照を使用するようにループを書き直しました(イテレータを避ける)。おめでとう、あなたは例外を修正しましたが、問題は修正しませんでした。

このループの実行中にリストを変更しています。今や、要素を削除するたびに。たびに最後の要素size()-1が見えます。操作の順序が次のようになった場合:

(some thread) 
remove an element from response.getSegments().getSegmentInfo() 
(some possibly other thread) 
lookup up the size()-1 element of the above 

存在しなくなった要素にアクセスすると、IndexOutOfBoundsExceptionが発生します。

このリストのロジックを修正する必要があります。すべての要素をチェックする必要がある場合、リストがすべての要素を横切っているとは限りません。ループのリストをフリーズします。

後者を行う簡単な方法は、リストのコピー(リストの要素ではない)を行い、コピーを反復することです。上記が書かれた後、問題が劇的に編集で変更として編集

--- ---

あなたは、いくつかの余分なリストのルックアップを含め、余分なコードの多くを追加しました。すべてのリストルックアップに同じインデックスを使用していますが、すべてのリストが同じサイズであることを示すものはありません。

また、あなたはおそらく、要素間でスキップしたくない、オッズあなたは本当にあなたが必要とするなどsegmentInfoキャビンのすべてのクラス、第三segmentInfo内だけではなく、第三cabinClass、

+0

すばらしい答え!あなたの前提はすべて正しいです。私はあなたがリストをコピーすることを提案したものを試してみる:)ありがとう! – jcotal

+0

あなたは正しいです。両方のリストのサイズが異なります。私は何をお勧めしますか?私はリストをコピーすると動作しないと思いますか? – jcotal

+0

ネストループを作成します。 –

関連する問題