是什么导致java.lang.arrayindexoutofboundsexception以及如何防止它?

rkkpypqq  于 2021-07-03  发布在  Java
关注(0)|答案(17)|浏览(499)

是什么 ArrayIndexOutOfBoundsException 我的意思是我该怎么摆脱它?
下面是触发异常的代码示例:

String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
    System.out.println(names[i]);
}
f8rj6qna

f8rj6qna16#

什么原因 ArrayIndexOutOfBoundsException ?
如果把一个变量看作一个可以放置值的“盒子”,那么数组就是一系列相邻放置的盒子,盒子的数量是一个有限的显式整数。
创建如下数组:

final int[] myArray = new int[5]

创建一行5个框,每个框包含一个 int . 每一个盒子都有一个索引,一个盒子序列中的位置。这个索引从0开始,到n-1结束,其中n是数组的大小(框的数目)。
要从这一系列框中检索其中一个值,可以通过其索引引用它,如下所示:

myArray[3]

这将为您提供系列中第四个框的值(因为第一个框的索引为0)。
ArrayIndexOutOfBoundsException 是由于试图通过传递高于上一个“box”的索引或负值来检索不存在的“box”而导致的。
在我运行的示例中,这些代码片段会产生这样一个异常:

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];
}
sigwle7e

sigwle7e17#

arrayindexoutofbounds意味着您正在尝试索引未分配的数组中的位置。
在这种情况下:

String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
    System.out.println(name[i]);
}

name.length是3,因为数组是用3个字符串对象定义的。
访问数组内容时,位置从0开始。因为有3个条目,所以它的意思是name[0]=“汤姆”,name[1]=“迪克”和name[2]=“哈里”
循环时,由于i可以小于或等于name.length,因此您正在尝试访问name[3],而name[3]不可用。
为了避开这个。。。
在for循环中,可以执行i<name.length。这将防止循环到名称[3],而是在名称[2]处停止 for(int i = 0; i<name.length; i++) 每个循环使用一个 String[] name = { "tom", "dick", "harry" }; for(String n : name) { System.out.println(n); } 使用list.foreach(使用者操作)(需要java8) String[] name = { "tom", "dick", "harry" }; Arrays.asList(name).forEach(System.out::println); 将数组转换为流-如果您想对数组执行其他“操作”,例如过滤、转换文本、转换为Map等,这是一个很好的选项(需要java8) String[] name = { "tom", "dick", "harry" }; --- Arrays.asList(name).stream().forEach(System.out::println); --- Stream.of(name).forEach(System.out::println);

相关问题