增强的For循环exception

在玩循环时创建以下代码。 下面的代码将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] + ", "); } 

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

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

例如,如果numbers = {1,2,3,9}那么i将是numbers = {1,2,3,9} 。 但是它的长度是4,所以当你循环它里面的元素时,你会尝试做超过它的大小的numbers[9]

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

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使用增强型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保存数字数组中的当前值,而不是当前索引。 这就是你获得IOOBE的原因。

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

应该

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

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