2012-03-28 10 views
0

このループは異常です。Javaインデックス配列境界外例外例外

これをJavaで実行した場合、インデックス外に例外が発生します。ソースコードのどこにでもint l宣言が見つかりません。何があって、このように宣言されているかがわかりません。

しかし、ここで取り上げるのは、このコードが何をしているのか分かりません。 resultSIListの任意のサイズについては、ArrayIndexOutOfBoundsExceptionとなります。

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){ 
    resultSIList.get(i); 
} 

EDIT:おかげですべての。

私はこのループ全体を理解しようとしている実行可能なコードです。はい、それはジャンクの恐ろしい部分です。

public class IndexOutOfBoundsTest { 
    public static void main(String args[]){ 
     int offset = 50; 

     int maxItemsInOnePage = 50; 

     int totalSIs = 50; 

     final int buildThis = 15; 

     List resultSIList = new ArrayList(); 

     // build list 
     for(int zz = 0; zz < buildThis; zz ++){ 
      resultSIList.add("Hi " + zz); 
     } 

     try{ 
      for (int i = offset, 
        d = Math.min(i + maxItemsInOnePage, totalSIs); 
        i < d; i++){ 

       System.out.println(resultSIList.get(i)); 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
+0

私はあなたのために1つの言葉を持っています:デバッガ。ステップスルーして、どのように動作があなたの前提条件に合わないかを確認してください。 – duffymo

+1

マイナスの「オフセット」がありますか? –

+0

resultSIListのサイズは何ですか –

答えて

1

小さいかどうかを確認する必要があります。その値を再確認してください。ここではいくつかのランダムな値を持つ作業例です:

List<Integer> resultSIList = Arrays.asList(1,2,3,4,5,6,7,8); 
int totalSIs = resultSIList.size(); 
int maxItemsInOnePage = 2; 
int offset = 1; 

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){ 
    resultSIList.get(i); 
} 

あなたは私が見るのコードを追加してから、そのtotalSIsが大きい(= 50)、リストのサイズ(= 15)。

あなたは簡単な修正のためにループのための右の後ろ

totalSIs = resultsSIList.size(); 

を追加することができます。

+0

こんにちはアンドレアス、私はあなたがこれについて正しいと思います。これがコードミスのようなものか、それとも本当に何かをしようとしているのかどうか分かりませんか? –

+0

そのコンテキストで合理的な何かをしているかもしれません - あなたが示しているコードはAIOOBEを投げる非常に複雑な方法です;) –

0

offsetがあなたのリストのサイズより小さいかどうかを確認してください。

+1

'offset'が大きければ(' totalSIs')、 'for' (i

2

このコードは、 'offset'の位置から 'offset + maxItemsInOnePage'と 'totalSIs'の最小値まで 'resulSIList'をループします。

offset> 0、totalSIs = resultSIList.size()の場合、範囲外の例外は発生しません。

あなたの例では、オフセットが50でリストサイズは15だけです。オフセットがリストのサイズより小さいことを確認する必要があります。

1

はあなたには、いくつかのログでそれを実行することができますいくつかのより多くの情報を追加取得するには:

System.out.println("offset: " + offset); 
System.out.println("maxItemsInOnePage: " + maxItemsInOnePage); 
System.out.println("totalSIs: " + totalSIs); 
System.out.println("resultSIList.size(): " + resultSIList.size()); 
for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){ 
    System.out.println("i: " + i); 
    resultSIList.get(i); 
} 

が、これはあなたの問題にいくつかの光を当てる必要があります実行しています。最後に印刷されたものは範囲外でした.4つの最初の印刷物を分析することで、問題を見つけることができます。

0

あなたはいつも、インデックスiが予想通りそれは場合を動作し、totalSIsに等しいかresultSIListの大きその後、小さい場合にのみ、サイズ

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); 
     i < l && i < resultSIList.size(); 
     i++){ 
    resultSIList.get(i); 
} 
関連する問題