このコードスロー
スレッド「メイン」での例外 java.lang.ArrayIndexOutOfBoundsException: 1
最後の行に。それはバグですか、それとも何ですか?(JDK7)
int ar[] = {1,2,3};
List arList = Arrays.asList(ar);
arList.set(1,8);
このコードスロー
スレッド「メイン」での例外 java.lang.ArrayIndexOutOfBoundsException: 1
最後の行に。それはバグですか、それとも何ですか?(JDK7)
int ar[] = {1,2,3};
List arList = Arrays.asList(ar);
arList.set(1,8);
いいえ、Arrays.asList
期待Integer []
していますが、合格していますint[]
。これで修正されるはずです。
Integer ar[] = {1,2,3};
この種のエラーを回避するには、生の型を使用しないでください。代わりにジェネリック型を使用してください。List
整数の が必要ですか?
これを試して:
int ar[] = {1,2,3};
List<Integer> arList = Arrays.asList(ar); // here
arList.set(1,8);
コンパイラは、コメントを書いた行にエラーを表示し、これが機能しないことを示します。がar
プリミティブ配列であるint[]
場合、あなたの場合、Arrays.asList(ar)
を返しますList<int[]>
。List<int[]>
互換性がありList<Integer>
ません。あなたが今持っているのは、配列である 1 つのエントリ (インデックス 0) を持つList
ofです。int[]
前述のように、プリミティブint ar[] = {1,2,3};
からオブジェクトInteger ar[] = {1,2,3};
に変更すると、 の戻り値の型が にArrays.asList(ar)
なるため、機能しますList<Integer>
。
指定された動作の理由は明らかですが、Arrays.asList() の javadoc にはこの状況について何も記載されておらず、プリミティブ配列が入力パラメーターとしてチェックされていませんでした。したがって、これはバグのように扱われるべきだと思います。
メソッド javadoc:
指定された配列に基づく固定サイズのリストを返します。(返されるリストへの変更は、配列に「ライト スルー」されます。) このメソッドは、{@link Collection#toArray} と組み合わせて、配列ベースの API とコレクション ベースの API の間のブリッジとして機能します。返されるリストはシリアル化可能で、{@link RandomAccess} を実装しています。
このメソッドは、複数の要素を含むように初期化された固定サイズのリストを作成する便利な方法も提供します。