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的主要内容,如果未能解决你的问题,请参考以下文章

2优先使用for-each循环

反编译看java for-each循环

从字节码看Java中for-each循环(增强for循环)实现原理

为啥 for-each 循环适用于数组? (爪哇)

如何将 for-each 循环应用于字符串中的每个字符?

Java学习笔记(for-each循环与数组的拷贝)