6

在玩循环时创建了以下代码。下面的代码将斐波那契值存储到一个数组中,然后使用 for 循环打印它们。

    int [] numbers;
    numbers = new int[25];

    numbers[0] = 1;
    numbers[1] = 1;
    System.out.println("Initializing the array values");

    for(int i = 2; i < numbers.length; i++)
    {
        numbers[i] = numbers[i-1] + numbers[i-2];
    }

    System.out.println("Printing out Fibonacci values");

    for(int i = 0; i < numbers.length; i++)
    {
        System.out.print(numbers[i] + ", ");
    }

上面的代码工作正常。不过,我第一次将它放在一起时,我使用了增强的 for 循环来打印出值(代码中的第二个 for 循环)。这编译得很好,但是当我运行它时,我得到以下信息;

Initializing the array values
Printing out Fibonacci values
1, 1, 2, 3, 8, 34, 377, 17711, Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 34
at ArrayDemo.main(ArrayDemo.java:21)

我不明白出了什么问题。更改第二个循环不应更改值(您会注意到斐波那契值是错误的(即缺失值))。而且我不明白为什么简单的增强 for 循环会跳过索引。现在,这并不是什么大不了的事,因为这不是针对项目或任何东西的,它只是让我感到困扰,我无法弄清楚它为什么会这样做。有什么线索吗?

增强的 for 循环看起来像这样;

for(int i : numbers)
    {
        System.out.print(numbers[i] + ", ");
    }
4

3 回答 3

5

for(int i = 0; i <= numbers.length; i++)应该

for(int i = 0; i < numbers.length; i++)

在 java 中,数组是基于 0 的索引。这意味着您的第一个元素应在索引 0 处访问,显然最后一个元素应在数组长度减 1 处访问。

int tab[] = new int[3]; //tab of length 3
tab[0] = 11;
tab[1] = 24;
tab[2] = 5;

tab[2]在这里,您通过调用or来访问最后一个元素tab[tab.length-1],这是等效的。


抱歉,这只是我在问题中提出的代码中的一个错误。

问题是你应该这样做:System.out.print(i + ", "); 你应该阅读这个这个关于增强 for 循环的内容。

for 语句还有另一种形式,专为通过集合和数组进行迭代而设计。这种形式有时被称为增强的 for 语句,可用于使您的循环更加紧凑和易于阅读。为了演示,请考虑以下数组,其中包含数字 1 到 10:

int[] numbers = {1,2,3,4,5,6,7,8,9,10};

以下程序EnhancedForDemo使用增强的 for 循环遍历数组:

class EnhancedForDemo {
    public static void main(String[] args){
         int[] numbers = 
             {1,2,3,4,5,6,7,8,9,10};
         for (int item : numbers) {
             System.out.println("Count is: " + item);
         }
    }
}

在此示例中,变量 item 保存numbers 数组中的当前值

所以item保存数字数组中的当前值,而不是当前索引。这就是为什么你得到一个IOOBE.

于 2013-05-18T11:09:01.710 回答
5
for(int i : numbers)
{
     System.out.print(numbers[i] + ", ");
}

i这是数组中的元素,而不是索引。它可能大于numbers.length.

例如,如果numbers = {1,2,3,9}theni将是1, 2, 3, 9. 但是它的长度是 4,所以当你循环它里面的元素时,你试图做的事情numbers[9]超过了它的大小。

你可能想要System.out.print(i + ", ");

于 2013-05-18T11:14:33.907 回答
2
for(int i : numbers)
{
    System.out.print(numbers[i] + ", ");
}

应该

   for(int i : numbers)
    {
        System.out.print(i + ", ");
    }

您不需要在增强的 for 循环中使用索引。

于 2013-05-18T11:15:52.837 回答