【问题标题】:Unable to find the cause for java.lang.ArrayIndexOutOfBoundsException [duplicate]无法找到 java.lang.ArrayIndexOutOfBoundsException 的原因 [重复]
【发布时间】:2016-06-19 05:42:14
【问题描述】:

我正在尝试运行以下程序,

public class Ocerloading {

    public static void main(String[] args) {
        int[] month_days = new int[12];
        String[] month_name = { "January", "February", "March", "April", "May", "June", "July", "August", "September",
                "October", "November", "December" };

         for (int i = 0; i < 12; i++) {

            if (i == 1) {
                month_days[i] = 28;
                continue ;
            }

            if (i <= 6) {
                if (i % 2 == 0)
                    month_days[i] = 31;

                else
                    month_days[i] = 30;
            } else {
                if (i % 2 == 0)
                    month_days[i] = 30;

                else
                    month_days[i] = 31;
            }
        }

        for (int x : month_days) {
            System.out.println(month_days[x]); 

        } 


    }

}

它给出了以下错误,

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 31
    at Ocerloading.main(Ocerloading.java:32)

我了解当我们尝试访问超出范围的数组元素时会发生此错误。但这似乎无效。

我编辑了输出。

【问题讨论】:

  • Eran 的回答是正确的。您可以很容易地发现这一点,方法是使用调试器单步执行您的代码并在异常之前以 x 的值为例。使用调试器是程序员的一项关键技能,而不是考虑以后学习的东西。一旦您设法编写了可编译的代码,就该开始学习如何使用调试器单步执行该代码了。
  • @Stewart,如前所述,它提到了 EnhancedForLoop,因此很可能是 for (int x : month_days) { ...
  • @T.J.Crowder 我认为month_days 是用于存储索引的int[]。如果您阅读代码,这显然是意图...
  • @Stewart,并非如此,它发生在增强的 for 循环中,因为代码将其视为索引,而它们是实际值。
  • 那些因为它看起来太初级而对主要 OP 的问题投反对票的人,请不要。人们必须从某个地方开始,我们 SO 在那里为他们提供支持。 OP提供了清晰的代码,问题也很重要。他是初学者,让我们帮助他,不要气馁在这里提问。谢谢。

标签: java arrays indexoutofboundsexception


【解决方案1】:

您误解了增强的 for 循环。它遍历数组的元素,而不是它们的索引。

应该是:

for (int x : month_days) {
    System.out.println(x); 
}

【讨论】:

    【解决方案2】:

    Java 5 中引入的enhanced for loop 为您提供了数组的元素。您期望它提供类似于传统 for 循环的索引。

    例如

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

    上面的方法会起作用,因为我们正在获取索引。

    根据您的情况,进行以下更改:

    for (int x : month_days) {
        System.out.println(x); 
    }
    

    这是因为这里x 不是数组索引,而是x 是存储在month_days 数组中的实际值。因此,当它尝试查找 month_days[12] 时,它会失败,因为 month_days 的大小为 12,因此索引为 0-11。

    【讨论】:

    • Holly molly 棒棒糖,这个答案不正确吗?投票者也请添加一些反馈。帮助我和 SO 改进。丹克。
    • 请在发布答案之前努力查找重复项。我在搜索中确实写了ArrayIndexOutOfBoundsException foreach,并找到了上面的链接帖子。我们不需要数百份相同的问题。
    • 同意,会跟进。感谢您的评论。
    猜你喜欢
    • 2015-12-30
    • 2013-11-22
    • 2019-12-28
    • 2017-09-18
    • 2019-09-19
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多