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…“这将保证随机数是一个正值。”——更准确地说,是一个非负值。零不是一个正值。