Java 当索引按数组大小进行模运算时,是否可能使索引越界?

Java 当索引按数组大小进行模运算时,是否可能使索引越界?,java,Java,我有下面的代码,但有时我会在subject.get的特定行中获得java.lang.ArrayIndexOutOfBoundsException。我不知道这怎么会发生,但它确实发生了。我有一些多线程正在进行,但是这个数组是函数的本地数组,不能从其他任何地方访问 // Within onCreate Random random = new Random(); // some where else List<Subject> subjects = new ArrayList<Su

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

// 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())
//在onCreate中
随机=新随机();
//还有别的地方吗
列表主题=新建ArrayList();
//这里有一些代码可以添加元素。
//这里有一些代码可以添加元素。
//这里有一些代码可以添加元素。
//这里有一些代码可以添加元素。
//这里有一些代码可以添加元素。
subjects.get(random.nextInt()%subjects.size())
如果random.nextInt()返回一个负整数,则mod操作的结果将为负

有关可能的解决方案,请参见注释。

来自:

nextInt()
操作将返回您

所有232个可能的int值

这也包括负值,这就是导致索引超出范围的原因

您可以使用
nextInt(int n)

nextInt(int n)
操作将返回您:

返回0到0之间的伪随机、均匀分布的int值 (包括)和指定值(不包括),从中提取 随机数发生器的序列


这将保证您知道随机数是一个正值。

是的。你能说“负一”吗当您的
ArrayList
为空时,第一次调用时会发生什么?将抛出
IndexOutOfBoundsException
,没有数组。有一些元素。。即使列表为空,它也会抛出
dividebyzeroception
firstTry random.nextInt(Integer.MAX_VALUE);参考:谢谢。这就是答案。更好的是,完全忘记mod(“%”),用
random.nextInt(subjects.size())
代替。IMHO…“这将保证随机数是一个正值。”——更准确地说,是一个非负值。零不是一个正值。