增强型for循环异常

6

在使用循环时,我编写了下面的代码。以下代码将Fibonacci值存储到数组中,然后使用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] + ", ");
    }
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]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 使用增强型循环来遍历数组:
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保存了来自numbers数组的当前值,而不是当前索引。这就是为什么会出现IOOBE错误。

3
关于0起始索引的简短解释将会让这个答案更加完善! - christopher
抱歉,那只是我在问题中发布的代码中的一个错误。第一次做得没错。这仍然无法解释为什么增强型for循环不起作用。我已经编辑了问题代码以反映这一点。 - Rudi Kershaw

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

i这里指的是数组中的元素,而非索引。它可能比numbers.length还要大。

例如,如果numbers = {1,2,3,9},那么i将是1239。但它的长度为4,因此当你循环遍历其中的元素时,你将尝试执行numbers[9],这将超出其大小。

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


1
谢谢。简洁易懂。 - Rudi Kershaw

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

应该是

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

在增强型for循环中,您无需使用索引。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接