当索引以数组大小为模时,是否有可能使索引超出约束?

时间:2013-04-04 18:02:41

标签: java

我有以下代码,但有时我会在java.lang.ArrayIndexOutOfBoundsException的特定行获得subject.gets。我不知道这是怎么发生的,但它刚刚发生了。我有一些多线程,但这个数组是函数的本地数据,不能从其他任何地方访问。

// Within onCreate
Random random = new Random();

// some where else
List<Subject> subjects = new ArrayList<Subject>();

// There is SOME CODE HERE TO ADD ELEMENTS.
// There is SOME CODE HERE TO ADD ELEMENTS.
// There is SOME CODE HERE TO ADD ELEMENTS.
// There is SOME CODE HERE TO ADD ELEMENTS.
// There is SOME CODE HERE TO ADD ELEMENTS.

subjects.get(random.nextInt() % subjects.size())

2 个答案:

答案 0 :(得分:6)

如果random.nextInt()返回负整数,则mod操作的结果将为负。

请参阅有关可能解决方案的评论。

答案 1 :(得分:2)

来自doc

nextInt() 操作会返回

  

所有2 32 可能的int值

这还包括否定值,这就是导致你有索引超出界限的原因

您可以采取的措施是使用nextInt(int n)

nextInt(int n) 操作会返回给您:

  

返回一个伪随机数,在0之间均匀分布的int值   (包括)和指定值(不包括),由此得出   随机数发生器的序列。

这将保证您随机数是值。