For-Each循环Java错误ArrayIndexOutOfBoundsException

Mat*_*eau 6 java arrays foreach for-loop

在我的程序中,我需要一个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++;
Run Code Online (Sandbox Code Playgroud)

这会引发错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 54
Run Code Online (Sandbox Code Playgroud)

Sur*_*tta 6

if (numbers[i] % 2 == 0) {
Run Code Online (Sandbox Code Playgroud)

在foreach循环内,您无需使用索引进行访问。只要iforeach继续给您element直接使用(而不是索引)所使用的数组/集合内的内容就足够了。

if (i % 2 == 0) {
Run Code Online (Sandbox Code Playgroud)
for (int i : numbers) {
        if (i % 2 == 0) {
            even++;
        }
        else{
            odd++;
        }
  }
Run Code Online (Sandbox Code Playgroud)

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

  • @AdeshKumar我没有重复。您应该已经检查了答案的时间戳。据我所知,我是第一个回答者。 (2认同)

Dhe*_*shi 6

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

for (int i : numbers) {

数组中的每个整数都将i逐个放置

所以,你做错了是:

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

for (int i : numbers) {
if (numbers[i] % 2 == 0) {
even++;
}
else {
odd++;
} 
Run Code Online (Sandbox Code Playgroud)

i不会像传统的for循环那样增加evrytime循环,这里i携带实际值

所以你应该改变numbers[i]%2==0为正义i%2==0

 for (int i : numbers) {
if (i % 2 == 0) {
    even++;
}
else {
    odd++;
  }
Run Code Online (Sandbox Code Playgroud)