ArrayIndexOutOfBoundsException是什么意思?我如何消除它?以下是触发异常的代码示例:
ArrayIndexOutOfBoundsException
String[] names = { "tom", "bob", "harry" }; for (int i = 0; i <= names.length; i++) { System.out.println(names[i]); }
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); }
nhhxz33t2#
无法迭代或存储超过数组长度的数据。在这种情况下,您可以这样做:
for (int i = 0; i <= name.length - 1; i++) { // .... }
或者:
for (int i = 0; i < name.length; i++) { // ... }
aoyhnmkz3#
在大多数编程语言中,索引是从0开始的。因此,您必须编写i<名称。长度或i<=名称。长度-1而不是i<=名称。长度。
vx6bjr1n4#
您可以在功能样式中使用可选,以避免NullPointerException和ArrayIndexOutOfBoundsException:
NullPointerException
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
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”。我希望你能明白。非常感谢。
ifsvaxew6#
ArrayIndexOutOfBoundsException名称本身解释说,如果您试图访问超出数组大小范围的索引值,则会发生此类异常。在您的例子中,您可以从for循环中删除等号。
for(int i = 0; i<name.length; i++)
更好的选择是迭代数组:
for(String i : name ) System.out.println(i);
iaqfqrcu7#
如果使用数组的长度来控制for循环的迭代,请始终记住数组中第一项的索引是0。因此,数组中最后一个元素的索引比数组的长度小1。
2fjabf4q8#
我在这里看到了解释如何使用数组以及如何避免索引越界异常的所有答案。我个人不惜一切代价避免使用数组。我使用Collections类,这避免了必须完全处理数组索引的所有愚蠢。循环构造与支持更易于编写、理解和维护的代码的集合完美结合。
j5fpnvbx9#
数组中的每个项都称为元素,每个元素都通过其数值索引进行访问。如上图所示,编号从0开始。例如,第9个元素将在索引8处访问。引发IndexOutboundsException以指示某种索引(如数组、字符串或向量)超出范围。可以从[0到(X.length-1)]访问任何数组X
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'); }
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 }
wz8daaqr12#
ArrayIndexOutOfBounds表示您正在尝试索引未分配的数组中的位置。在这种情况下:
String[] name = { "tom", "dick", "harry" }; for (int i = 0; i <= name.length; i++) { System.out.println(name[i]); }
为了避开这个。。。
String[] name = { "tom", "dick", "harry" }; for(String n : name) { System.out.println(n); }
String[] name = { "tom", "dick", "harry" }; Arrays.asList(name).forEach(System.out::println);
String[] name = { "tom", "dick", "harry" }; --- Arrays.asList(name).stream().forEach(System.out::println); --- Stream.of(name).forEach(System.out::println);
jtw3ybtb13#
ArrayIndexOutOfBoundsException每当出现此异常时,表示您试图使用超出其界限的数组索引,或者在外行术语中,您请求的索引超过了您初始化的索引。为防止出现这种情况,请始终确保您没有请求数组中不存在的索引,即如果数组长度为10,则索引的范围必须在0到9之间
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
for (int index = 0; index < array.length; index++)
(当然,这是假设您需要索引。如果您可以使用增强的for循环,请这样做。)
mm9b1k5b15#
对于多维数组,确保访问正确维度的length属性可能很棘手。以以下代码为例:
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].length与a[j].length相同)。相反,内部环路应使用a[i][j].length(或为简单起见,使用a[0][0].length)。
a[i].length
a[j].length
a[i][j].length
a[0][0].length
26条答案
按热度按时间zysjyyx41#
对于任何长度为n的数组,数组的元素将具有从0到n-1的索引
如果程序试图访问数组索引大于n-1的任何元素(或内存),则Java将抛出ArrayIndexOutOfBoundsException
因此,我们可以在程序中使用两种解决方案
1.保持计数:
或者其他一些循环语句,比如
1.一种更好的方法是对每个循环使用A,在这种方法中,程序员无需担心数组中的元素数量。
nhhxz33t2#
无法迭代或存储超过数组长度的数据。在这种情况下,您可以这样做:
或者:
aoyhnmkz3#
在大多数编程语言中,索引是从0开始的。因此,您必须编写i<名称。长度或i<=名称。长度-1而不是i<=名称。长度。
vx6bjr1n4#
您可以在功能样式中使用可选,以避免
NullPointerException
和ArrayIndexOutOfBoundsException
:输出:
56lgkhnf5#
此错误发生在运行循环超限时间。让我们考虑这样一个简单的例子,
首先,我将数组初始化为“numberrarray”。然后,使用for循环打印一些数组元素。当循环运行“i”时间时,打印(NumberRay[i+1]元素……(当i值为1时,打印numberArray[i+2]元素。)。假设当i=(NumberRaray.length-2)时,打印数组的最后一个元素。。当“i”值变为(numberArray.length-1)时,不打印任何值。此时,将发生“ArrayIndexOutOfBoundsException”。我希望你能明白。非常感谢。
ifsvaxew6#
ArrayIndexOutOfBoundsException
名称本身解释说,如果您试图访问超出数组大小范围的索引值,则会发生此类异常。在您的例子中,您可以从for循环中删除等号。
更好的选择是迭代数组:
iaqfqrcu7#
如果使用数组的长度来控制for循环的迭代,请始终记住数组中第一项的索引是0。因此,数组中最后一个元素的索引比数组的长度小1。
2fjabf4q8#
我在这里看到了解释如何使用数组以及如何避免索引越界异常的所有答案。我个人不惜一切代价避免使用数组。我使用Collections类,这避免了必须完全处理数组索引的所有愚蠢。循环构造与支持更易于编写、理解和维护的代码的集合完美结合。
j5fpnvbx9#
数组中的每个项都称为元素,每个元素都通过其数值索引进行访问。如上图所示,编号从0开始。例如,第9个元素将在索引8处访问。
引发IndexOutboundsException以指示某种索引(如数组、字符串或向量)超出范围。
可以从[0到(X.length-1)]访问任何数组X
ltqd579y10#
根据您的代码:
如果您检查System.out.print(name.length);
你将得到3;
这意味着你的名字长度是3
您的循环从0运行到3,它应该运行“0到2”或“1到3”
回答
kkih6yb811#
ArrayIndexOutOfBoundsException
表示您试图访问不存在或超出此数组边界的数组索引。数组索引从0开始,以长度-1结束。在你的情况下
ArrayIndexOutOfBoundsException
在您尝试访问名称时发生。不存在的长度索引元素(数组索引以长度-1结束)。只需将<=替换为<即可解决此问题。wz8daaqr12#
ArrayIndexOutOfBounds表示您正在尝试索引未分配的数组中的位置。
在这种情况下:
为了避开这个。。。
for(int i = 0; i<name.length; i++)
String[] name = { "tom", "dick", "harry" }; for(String n : name) { System.out.println(n); }
String[] name = { "tom", "dick", "harry" }; Arrays.asList(name).forEach(System.out::println);
String[] name = { "tom", "dick", "harry" }; --- Arrays.asList(name).stream().forEach(System.out::println); --- Stream.of(name).forEach(System.out::println);
jtw3ybtb13#
ArrayIndexOutOfBoundsException每当出现此异常时,表示您试图使用超出其界限的数组索引,或者在外行术语中,您请求的索引超过了您初始化的索引。
为防止出现这种情况,请始终确保您没有请求数组中不存在的索引,即如果数组长度为10,则索引的范围必须在0到9之间
whlutmcx14#
您的第一个呼叫端口应该是documentation,它合理清晰地解释了这一点:
抛出以指示已使用非法索引访问数组。索引为负数或大于或等于数组的大小。
例如:
至于如何避免……嗯,不要这样做。小心数组索引。
人们有时遇到的一个问题是认为数组是1索引的,例如。
这将丢失第一个元素(索引0),并在索引为5时抛出异常。此处的有效索引包括0-4。此处正确、惯用的
for
语句如下:(当然,这是假设您需要索引。如果您可以使用增强的for循环,请这样做。)
mm9b1k5b15#
对于多维数组,确保访问正确维度的
length
属性可能很棘手。以以下代码为例:每个维度具有不同的长度,因此微妙的缺陷在于中间和内部循环使用相同维度的
length
属性(因为a[i].length
与a[j].length
相同)。相反,内部环路应使用
a[i][j].length
(或为简单起见,使用a[0][0].length
)。