是什么原因造成的ArrayIndexOutOfBoundsException
?
如果您将变量视为可以放置值的“盒子”,则数组是一系列彼此相邻放置的盒子,其中盒子的数量是有限且显式的整数。
创建一个像这样的数组:
final int[] myArray = new int[5]
创建一行5个框,每个框包含一个int
。每个盒子都有一个索引,在一系列盒子中的位置。该索引从0开始,以N-1结束,其中N是数组的大小(框数)。
要从这一系列框中检索值之一,可以通过其索引引用它,如下所示:
myArray[3]
这将为您提供系列中第4个框的值(因为第一个框的索引为0)。
一个ArrayIndexOutOfBoundsException
是由试图以检索一个“盒子”不存在,通过使指数比去年的“盒子”,或负的指数走高而引起的。
在我运行的示例中,这些代码段将产生这样的异常:
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
如何避免 ArrayIndexOutOfBoundsException
为了防止ArrayIndexOutOfBoundsException
,需要考虑一些关键点:
循环播放
遍历数组时,请始终确保要检索的索引严格小于数组的长度(框数)。例如:
for (int i = 0; i < myArray.length; i++) {
请注意<
,请勿=
在其中混用。
您可能想尝试执行以下操作:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
只是不要。坚持上面的一项(如果您需要使用索引),它将为您节省很多痛苦。
尽可能使用foreach:
for (int value : myArray) {
这样,您完全不必考虑索引。
循环时,无论您做什么,都不要更改循环迭代器的值(此处为i
)。此值应该更改的唯一地方是保持循环继续进行。否则将其更改只是冒着例外的风险,并且在大多数情况下不是必需的。
检索/更新
检索数组的任意元素时,请始终检查它是否是针对数组长度的有效索引:
public Integer getArrayElement(final int index) {
if (index < 0 || index >= myArray.length) {
return null; //although I would much prefer an actual exception being thrown when this happens.
}
return myArray[index];
}