为什么这个Java foreach循环会抛出错误?

时间:2013-03-31 01:22:22

标签: java loops

我有以下简单的Java语句:

public static void main(String[] args) 
{
    int[] grades = {102, 105, 98, 105};

    Sorts.selectionSort(grades);

    for (int grade : grades) {
   // {
        System.out.println(grade);
        try {
            System.out.print(grades[grade] + "     ");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Error!");
        }
    }

我得到以下输出:

102
Error!
105
Error!
98
Error!
105
Error!

为什么循环会迭代到不在数组中的值?我很困惑。

谢谢。

4 个答案:

答案 0 :(得分:1)

int grade是数组中每个元素的值,而不是索引。

如果你想获得int[] grades = {102, 105, 98, 105};的每个元素,你应该使用这样的常规for循环:

for (int i = 0; i < grades.length; i++) {
  System.out.println(grades[i]);
}

这将起作用,因为数组中每个元素的索引范围为0到3。

查看enhanced for loop文档。

答案 1 :(得分:1)

抛出索引超出绑定错误,因为“grade”变量已经是数组内部的值,而不是索引。

所以它会在第一个System.out.println()上打印出来,但是你试图这样做 在try / catch

成绩[102]

你的数组没有那个索引。它的最大指数是3( - > 105)。

答案 2 :(得分:0)

foreach循环迭代数组的,而不是索引。

因此,grade102 您正在尝试访问4项数组的103 rd (从0开始)元素。
这不会起作用

答案 3 :(得分:0)

您的第一个打印语句恰当地使用gradefor循环通过将数组中的每个值分配给grade来进行迭代。

您的第二个打印语句使用grade作为grades的索引。这是错误的,因为grade是数组中的值,而不是索引。尽管您编写的for循环比带有索引的for循环更简单,但有时您需要知道索引,因此您可能希望重写for循环。