是什么导致java.lang.ArrayIndexOutOfBoundsException,我如何防止它?

thtygnil  于 2022-09-16  发布在  Java
关注(0)|答案(26)|浏览(249)

ArrayIndexOutOfBoundsException是什么意思?我如何消除它?
以下是触发异常的代码示例:

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

zysjyyx41#

对于任何长度为n的数组,数组的元素将具有从0到n-1的索引

如果程序试图访问数组索引大于n-1的任何元素(或内存),则Java将抛出ArrayIndexOutOfBoundsException
因此,我们可以在程序中使用两种解决方案
1.保持计数:

for(int count = 0; count < array.length; count++) {
    System.out.println(array[count]);
}

或者其他一些循环语句,比如

int count = 0;
while(count < array.length) {
    System.out.println(array[count]);
    count++;
}

1.一种更好的方法是对每个循环使用A,在这种方法中,程序员无需担心数组中的元素数量。

for(String str : array) {
    System.out.println(str);
}
nhhxz33t

nhhxz33t2#

无法迭代或存储超过数组长度的数据。在这种情况下,您可以这样做:

for (int i = 0; i <= name.length - 1; i++) {
    // ....
}

或者:

for (int i = 0; i < name.length; i++) {
    // ...
}
aoyhnmkz

aoyhnmkz3#

在大多数编程语言中,索引是从0开始的。因此,您必须编写i<名称。长度i<=名称。长度-1而不是i<=名称。长度

vx6bjr1n

vx6bjr1n4#

您可以在功能样式中使用可选,以避免NullPointerExceptionArrayIndexOutOfBoundsException

String[] array = new String[]{"aaa", null, "ccc"};
for (int i = 0; i < 4; i++) {
    String result = Optional.ofNullable(array.length > i ? array[i] : null)
            .map(x -> x.toUpperCase()) //some operation here
            .orElse("NO_DATA");
    System.out.println(result);
}

输出:

AAA
NO_DATA
CCC
NO_DATA
56lgkhnf

56lgkhnf5#

此错误发生在运行循环超限时间。让我们考虑这样一个简单的例子,

class demo{
  public static void main(String a[]){

    int[] numberArray={4,8,2,3,89,5};

    int i;

    for(i=0;i<numberArray.length;i++){
        System.out.print(numberArray[i+1]+"  ");
    }
}

首先,我将数组初始化为“numberrarray”。然后,使用for循环打印一些数组元素。当循环运行“i”时间时,打印(NumberRay[i+1]元素……(当i值为1时,打印numberArray[i+2]元素。)。假设当i=(NumberRaray.length-2)时,打印数组的最后一个元素。。当“i”值变为(numberArray.length-1)时,不打印任何值。此时,将发生“ArrayIndexOutOfBoundsException”。我希望你能明白。非常感谢。

ifsvaxew

ifsvaxew6#

ArrayIndexOutOfBoundsException名称本身解释说,如果您试图访问超出数组大小范围的索引值,则会发生此类异常。
在您的例子中,您可以从for循环中删除等号。

for(int i = 0; i<name.length; i++)

更好的选择是迭代数组:

for(String i : name )
      System.out.println(i);
iaqfqrcu

iaqfqrcu7#

如果使用数组的长度来控制for循环的迭代,请始终记住数组中第一项的索引是0。因此,数组中最后一个元素的索引比数组的长度小1。

2fjabf4q

2fjabf4q8#

我在这里看到了解释如何使用数组以及如何避免索引越界异常的所有答案。我个人不惜一切代价避免使用数组。我使用Collections类,这避免了必须完全处理数组索引的所有愚蠢。循环构造与支持更易于编写、理解和维护的代码的集合完美结合。

j5fpnvbx

j5fpnvbx9#

数组中的每个项都称为元素,每个元素都通过其数值索引进行访问。如上图所示,编号从0开始。例如,第9个元素将在索引8处访问。
引发IndexOutboundsException以指示某种索引(如数组、字符串或向量)超出范围。
可以从[0到(X.length-1)]访问任何数组X

ltqd579y

ltqd579y10#

根据您的代码:

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

如果您检查System.out.print(name.length);
你将得到3;
这意味着你的名字长度是3
您的循环从0运行到3,它应该运行“0到2”或“1到3”

回答

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

kkih6yb811#

ArrayIndexOutOfBoundsException表示您试图访问不存在或超出此数组边界的数组索引。数组索引从0开始,以长度-1结束。
在你的情况下

for(int i = 0; i<=name.length; i++) {
    System.out.print(name[i] +'\n'); // i goes from 0 to length, Not correct
}

ArrayIndexOutOfBoundsException在您尝试访问名称时发生。不存在的长度索引元素(数组索引以长度-1结束)。只需将<=替换为<即可解决此问题。

for(int i = 0; i < name.length; i++) {
    System.out.print(name[i] +'\n');  // i goes from 0 to length - 1, Correct
}
wz8daaqr

wz8daaqr12#

ArrayIndexOutOfBounds表示您正在尝试索引未分配的数组中的位置。
在这种情况下:

String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
    System.out.println(name[i]);
}
  • 名字。长度为3,因为数组定义了3个字符串对象。
  • 当访问数组的内容时,位置从0开始。因为有3个项,它意味着名称[0]=“tom”,名称[1]=“dick”,名称[2]=“harry”
  • 循环时,因为i可以小于或等于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); }

  • 使用列表。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);

jtw3ybtb

jtw3ybtb13#

ArrayIndexOutOfBoundsException每当出现此异常时,表示您试图使用超出其界限的数组索引,或者在外行术语中,您请求的索引超过了您初始化的索引。
为防止出现这种情况,请始终确保您没有请求数组中不存在的索引,即如果数组长度为10,则索引的范围必须在0到9之间

whlutmcx

whlutmcx14#

您的第一个呼叫端口应该是documentation,它合理清晰地解释了这一点:
抛出以指示已使用非法索引访问数组。索引为负数或大于或等于数组的大小。
例如:

int[] array = new int[5];
int boom = array[10]; // Throws the exception

至于如何避免……嗯,不要这样做。小心数组索引。
人们有时遇到的一个问题是认为数组是1索引的,例如。

int[] array = new int[5];
// ... populate the array here ...
for (int index = 1; index <= array.length; index++)
{
    System.out.println(array[index]);
}

这将丢失第一个元素(索引0),并在索引为5时抛出异常。此处的有效索引包括0-4。此处正确、惯用的for语句如下:

for (int index = 0; index < array.length; index++)

(当然,这是假设您需要索引。如果您可以使用增强的for循环,请这样做。)

mm9b1k5b

mm9b1k5b15#

对于多维数组,确保访问正确维度的length属性可能很棘手。以以下代码为例:

int [][][] a  = new int [2][3][4];

for(int i = 0; i < a.length; i++){
    for(int j = 0; j < a[i].length; j++){
        for(int k = 0; k < a[j].length; k++){
            System.out.print(a[i][j][k]);
        }
        System.out.println();
    }
    System.out.println();
}

每个维度具有不同的长度,因此微妙的缺陷在于中间和内部循环使用相同维度的length属性(因为a[i].lengtha[j].length相同)。
相反,内部环路应使用a[i][j].length(或为简单起见,使用a[0][0].length)。

相关问题