首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >For-Each循环Java错误ArrayIndexOutOfBoundsException

For-Each循环Java错误ArrayIndexOutOfBoundsException
EN

Stack Overflow用户
提问于 2018-02-08 21:38:18
回答 6查看 1.8K关注 0票数 6

在我的程序中,我需要一个for-each循环,它计算给定数组中的evens数,并为每个evens递增变量even。当我使用一个标准的for循环时,比如(i = 0; i < numbers.length; i++;),那么代码就能正常工作。然而,我的赋值要求我对这个特定的问题使用for-each循环。我做错了什么吗?

代码语言:javascript
复制
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++;

这会抛出错误:

代码语言:javascript
复制
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 54
EN

回答 6

Stack Overflow用户

发布于 2018-02-08 21:39:41

代码语言:javascript
复制
if (numbers[i] % 2 == 0) {

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

代码语言:javascript
复制
if (i % 2 == 0) {

代码语言:javascript
复制
for (int i : numbers) {
        if (i % 2 == 0) {
            even++;
        }
        else{
            odd++;
        }
  }

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

票数 7
EN

Stack Overflow用户

发布于 2018-02-08 21:44:00

对于您案例中的每个循环,将按如下方式进行解释:

for (int i : numbers) {

数组数字中的每个整数将逐一放入i

所以,你做错的地方是:

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

代码语言:javascript
复制
for (int i : numbers) {
if (numbers[i] % 2 == 0) {
even++;
}
else {
odd++;
} 

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

因此您应该从numbers[i]%2==0更改为只使用i%2==0

代码语言:javascript
复制
 for (int i : numbers) {
if (i % 2 == 0) {
    even++;
}
else {
    odd++;
  }
票数 6
EN

Stack Overflow用户

发布于 2018-02-08 21:45:41

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

代码语言:javascript
复制
for (int i : numbers) {
    if (i % 2 == 0) { // <-- use i not numbers[i]
        even++;
    }
    else {
        odd++;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48686833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档