Java ListでIndexOutOfBoundsExceptionって起きてるけど

List型の変数に、ArrayListインスタンスを代入してたわけですが、

List<integer> select = new ArrayList<integer>();
// 途中省略
select.set(0, 0);
select.set(1, 1);
select.set(2, 2);

とか、やって見事に怒られるわけですが、結論は、ArrayListインスタンスに要素が1つも作られていないのに、値をセットしようとしたためでした。

f:id:ts0818:20170722105557p:plain

配列のように、最初に要素数を決めなくてもいいためウッカリしてましたが、ArrayListも初期化処理をしないと、要素数が0になってしまっているので、インデックスも無いことになっていたようです。

⇩  remove() とか使ったりして、要素を削除してるときも注意が必要っぽいです。

Java - 起こるはずのないIndexOutOfBoundsExceptionが起こる(37354)|teratail

 

今回の場合は、set() を利用する前には、add() で要素を追加しておくことで解決できました。

public class Controller {
  List<Integer> select = new ArrayList<Integer>();
  list.add(0);
  list.add(1);
  list.add(2);
}

もしくは、

public class Controller {
  List<Integer> select = new ArrayList<Integer>(){
    {
      list.add(0);
      list.add(1);
      list.add(2);
    }
  };
}

⇧ こんな書き方もできるらしい。インスタンスイニシャライザという、インスタンスの生成時にメソッドを呼ぶ書き方のようですが、Eclipseだと、serialVersionUID を追加しろというワーニングが出るみたい。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Controller {
  List<Integer> select = new ArrayList<Integer>(Arrays.<Integer>asList(0, 1, 2));
}

⇧ というadd()を使わない初期化も書けるようです。

Java の List の初期値を1行で設定する方法 - Corredor