List型の変数に、ArrayListのインスタンスを代入してたわけですが、
List<integer> select = new ArrayList<integer>(); // 途中省略 select.set(0, 0); select.set(1, 1); select.set(2, 2);
とか、やって見事に怒られるわけですが、結論は、ArrayListのインスタンスに要素が1つも作られていないのに、値をセットしようとしたためでした。
配列のように、最初に要素数を決めなくてもいいためウッカリしてましたが、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
今回はこのへんで。