for-Each循环Java错误ArrayIndexOutOfBoundsException

时间:2018-02-08 13:38:18

标签: java arrays for-loop foreach

在我的程序中,我需要一个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

6 个答案:

答案 0 :(得分:5)

if (numbers[i] % 2 == 0) {

在foreach循环中,您无需使用索引访问它。只要i就足够了,因为foreach keep会在你正在使用的数组/集合中直接给你element(而不是索引)。

if (i % 2 == 0) {
for (int i : numbers) {
        if (i % 2 == 0) {
            even++;
        }
        else{
            odd++;
        }
  }

实际上,通过检查第一个循环本身的偶数或奇数,可以完全消除第二个循环,从而缩短代码。

答案 1 :(得分:5)

对于您案例中的每个循环,将解释如下:

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++;
  }

答案 2 :(得分:1)

i是数字本身,而不是索引。所以你应该:

for (int i : numbers) {
    if (i % 2 == 0) { // <-- use i not numbers[i]
        even++;
    }
    else {
        odd++;
    }
}

答案 3 :(得分:1)

代替numbers[i]中的if (numbers[i] % 2 == 0),只需放入i

i中的for (int i : numbers)实际上将元素存储在数组(numbers)中,从0th索引到数组的length

if (numbers[i] % 2 == 0)中,numbers[i]将为您提供ith索引处的元素。并且i的值是一个来自(int)(Math.random() * 51 + 50)的随机数,它将总是比number50。因此,您要尝试访问的元素超出了您声明​​的数组大小的范围,即8中的int [] numbers = new int[8]

答案 4 :(得分:0)

对于每个循环,无需提供数字[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++;

答案 5 :(得分:0)

虽然有很多答案。您也可以通过使用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;