For-Each循环Java错误ArrayIndexOutOfBoundsException
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了For-Each循环Java错误ArrayIndexOutOfBoundsException相关的知识,希望对你有一定的参考价值。
在我的程序中,我需要一个for-each循环,它计算给定数组中的均匀数,并为每个循环增加变量even
。当我使用标准的for
循环,即(i = 0; i < numbers.length; i++;)
时,代码工作正常。但是,我的作业要求我为这个特定问题使用for-each循环。难道我做错了什么?
int [] numbers = new int[8];
int even = 0;
int odd = 0;
for (int i = 0; i < numbers.length; i++) {
numbers[i] = (int)(Math.random() * 51 + 50);
}
for (int i : numbers) {
if (numbers[i] % 2 == 0) {
even++;
}
else
odd++;
这会引发错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 54
对于您案例中的每个循环,将解释如下:
for (int i : numbers) {
数组中的每个整数都将逐个放在i
中
所以,你做错了是:
if (numbers[i] % 2 == 0) {
for (int i : numbers) {
if (numbers[i] % 2 == 0) {
even++;
}
else {
odd++;
}
i
不会像传统的for循环那样增加evrytime循环,这里i
带有实际值
所以你应该从numbers[i]%2==0
改为i%2==0
for (int i : numbers) {
if (i % 2 == 0) {
even++;
}
else {
odd++;
}
if (numbers[i] % 2 == 0) {
在foreach循环中,您无需使用索引访问它。只需i
就足够了,因为foreach keep on在你使用的数组/集合中直接给你element
(而不是索引)。
if (i % 2 == 0) {
for (int i : numbers) {
if (i % 2 == 0) {
even++;
}
else{
odd++;
}
}
实际上,通过检查第一个循环本身的偶数或奇数,可以完全消除第二个循环,从而缩短代码。
i
是数字本身,而不是索引。所以你应该:
for (int i : numbers) {
if (i % 2 == 0) { // <-- use i not numbers[i]
even++;
}
else {
odd++;
}
}
虽然有很多答案。您也可以通过使用java-8流来实现相同的目的。使用reducer来找出偶数,然后从长度减去偶数计数得到奇数。
见下面的代码: -
int[] numbers = new int[8];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = (int) (Math.random() * 51 + 50);
}
int even = Arrays.stream(numbers)
.reduce(0, (a, b) -> {
a += b % 2 == 0 ? 1 : 0;
return a;
});
int odd = numbers.length - even;
在for Each循环中无需提供数字[i],因此请使用以下代码。 对于(int i:numbers),int i是数组中出现的数字。所以只是把数字本身放在数字上。如果您正在使用数字[i],那么它将检查第i个索引的值,如果任何数字大于您的数组大小,它将抛出ArrayOutOfBox异常。
int [] numbers = new int[8];
int even = 0;
int odd = 0;
for (int i = 0; i < numbers.length; i++) {
numbers[i] = (int)(Math.random() * 51 + 50);
}
for (int i : numbers) {
if (i % 2 == 0) {
even++;
}
else
odd++;
以上是关于For-Each循环Java错误ArrayIndexOutOfBoundsException的主要内容,如果未能解决你的问题,请参考以下文章