一、概述
在本教程中,我们将讨论Java 中的ArrayIndexOutOfBoundsException
。我们将了解它为什么会发生以及如何避免它。
2.ArrayIndexOutOfBoundsException
什么时候发生?
众所周知,在Java中,数组是一种静态数据结构,我们在创建时就定义了它的大小。
我们使用索引访问数组的元素。数组中的索引从零开始,并且不能大于或等于数组的大小。
简而言之,经验法则是0 <= index <(数组大小)。
ArrayIndexOutOfBoundsException
在我们访问一个数组或Collection
时发生,该数组由具有无效索引的数组支持。这意味着索引小于零或大于或等于数组的大小。
此外,边界检查发生在运行时。因此,ArrayIndexOutOfBoundsException
是一个运行时异常。因此,我们在访问数组的边界元素时需要格外小心。
让我们了解一些导致ArrayIndexOutOfBoundsException
的常见操作。
2.1 访问数组
访问数组时可能发生的最常见错误是忘记了上限和下限。
数组的下限始终为0,而上限比其长度小1。
访问超出这些范围的数组元素会抛出ArrayIndexOutOfBoundsException
:
int[] numbers = new int[] {1, 2, 3, 4, 5}; int lastNumber = numbers[5];
这里,数组的大小是5,这意味着索引的范围是0 到4。
在这种情况下,访问第5 个索引会导致ArrayIndexOutOfBoundsException
:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5 at ...
同样,如果我们将小于零的值作为数字的索引传递,我们会得到ArrayIndexOutOfBoundsException
numbers.
2.2.访问Arrays.asList()
返回的List
静态方法Arrays.asList()
返回一个由指定数组支持的固定大小的列表。此外,它充当基于数组和基于集合的API 之间的桥梁。
返回的List
具有基于索引访问其元素的方法。此外,与数组类似,索引从零开始,范围为比其大小小一。
如果我们尝试访问超出此范围的Arrays.asList()
返回的List
的元素,我们会得到一个ArrayIndexOutOfBoundsException
:
List<Integer> numbersList = Arrays.asList(1, 2, 3, 4, 5); int lastNumber = numbersList.get(5);
在这里,我们再次尝试获取List
的最后一个元素。最后一个元素的位置是5,但它的索引是4(大小- 1)。因此,我们得到ArrayIndexOutOfBoundsException
如下:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5 at java.base/java.util.Arrays$ArrayList.get(Arrays.java:4351) at ...
同样,如果我们传递一个负索引,比如-1,我们将得到类似的结果。
2.3.在循环中迭代
有时,在for 循环中迭代数组时,我们可能会输入错误的终止表达式。
我们可能最终迭代直到它的长度,而不是在比数组长度小一的位置终止索引:
int sum = 0; for (int i = 0; i <= numbers.length; i++) { sum += numbers[i]; }
在上面的终止表达式中,循环变量i
被比较为小于或等于我们现有数组numbers.
因此,在最后一次迭代中,i
的值将变为5。
由于索引5 超出了numbers,
它将再次导致ArrayIndexOutOfBoundsException
:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5 at com.baeldung.concatenate.IndexOutOfBoundExceptionExamples.main(IndexOutOfBoundExceptionExamples.java:22)
3. 如何避免ArrayIndexOutOfBoundsException
?
现在让我们了解一些避免ArrayIndexOutOfBoundsException
的方法。
3.1 记住起始索引
我们必须始终记住,数组索引在Java 中从0 开始。因此,第一个元素始终位于索引0 处,而最后一个元素位于比数组长度小1 处的索引处。
记住这条规则将帮助我们在大多数情况下避免ArrayIndexOutOfBoundsException
。
3.2.正确使用循环中的运算符
将循环变量错误地初始化为索引1 可能会导致ArrayIndexOutOfBoundsException
。
同样,在循环的终止表达式中错误地使用运算符<、<=、> 或>= 是发生此异常的常见原因。
我们应该正确地确定这些运算符在循环中的使用。
3.3.使用增强for
循环
如果我们的应用程序在Java 1.5 或更高版本上运行,我们应该使用增强for
循环语句,该语句专门开发用于迭代集合和数组。此外,它使我们的循环更加简洁易读。
此外,使用增强for
循环可以帮助我们完全避免ArrayIndexOutOfBoundsException
,因为它不涉及索引变量:
for (int number : numbers) { sum += number; }
在这里,我们不必担心索引。增强for
循环在每次迭代中拾取一个元素并将其分配给循环变量number
。因此,它完全避免了ArrayIndexOutOfBoundsException
。
4.IndexOutOfBoundsException
与ArrayIndexOutOfBoundsException
当我们尝试访问超出其范围的某种类型(String
、数组、List
等)的索引时,会发生IndexOutOfBoundsException
。它是ArrayIndexOutOfBoundsException
和StringIndexOutOfBoundsException
的超类。
与ArrayIndexOutOfBoundsException
类似,当我们尝试访问具有超出其长度的索引的String
的字符时,会抛出StringIndexOutOfBoundsException
。
5. 结论
在本文中,我们探讨了ArrayIndexOutOfBoundsException
,一些关于它如何发生的示例,以及一些避免它的常用技术。
0 评论