【问题标题】:Java: Array Index Out of BoundsJava:数组索引越界
【发布时间】:2012-02-06 21:22:44
【问题描述】:

我得到了这个例外:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
at Vindu.<init>(setevelger.java:64)
at setevelger.main(setevelger.java:22)

当我运行这段代码时:

    public knapp seter[]=new knapp[100]; //knapp means button

    int rad=0; //rows
    int sete=0; //seats     
    int antallSeter=0; //number of seats
    for (int i=0;i<10;i++){
        for (int j=0;j<10;j++){
            seter[antallSeter]= new knapp("Rad "+(rad+1)+", Sete "+(sete+1));
            seter[antallSeter].setBackground(Color.GREEN);

            add(seter[antallSeter]); 
            antallSeter++;              
            if(j==10){
                sete=0;
                }else{              
                    sete++; 
                    }           
            }
        rad++;
        }   

    //creates an eventlistener
    Knappelytter lytteren = new Knappelytter();
    seter[antallSeter].addActionListener(lytteren);
    pack();     

如果我这样做:

public knapp seter[]=new knapp[120]; //knapp means button

我收到此错误:

Exception in thread "main" java.lang.NullPointerException
at Vindu.<init>(setevelger.java:64)
at setevelger.main(setevelger.java:22)

这两个错误都是在创建窗口时在运行时出现的。

因此,代码应该创建100个按钮并将它们存储在一个数组中,每个按钮都有一个行号和座位号。

我被卡住了,我不知道该去哪里找了..

我应该使用数组列表吗?

【问题讨论】:

  • 请告诉我们 setevelger.java 文件的第 64 行
  • j == 10 怎么可能是真的??
  • 这并不能真正回答您的问题,但会有所帮助。你的循环中有if(j==10) 声明..;j&lt;10;..,这意味着j 永远不会等于10。此外,除非它们在你的循环之外使用seterad 不需要,你可以只使用@987654330 @ 和 j"rad " +(i+1)+", Sete "+(j+1));那你就不需要antallSeter++;之后的部分了
  • 你能告诉我们 setevelger.java 第 64 行和第 22 行的内容吗?
  • 请不要以小写字母开头你的类名(new knapp(...))。这不符合 java 命名约定,并且可以防止混淆。 ;)

标签: java arrays exception arraylist


【解决方案1】:

在您的 for 循环中,antalSetter 在最后一个循环中增加到 100 - 第一个例外,如果您将数组长度增加到 120 - 您正在访问索引 100 处的元素,该元素为空。

【讨论】:

  • 为什么要测试 j == 10 ?一些微优化:) ?
  • 我正在测试,因为我希望每个座位都有一个座位号,并且每排应该有 10 个座位,所以当 j==10 时,下一行再次从 0 开始:)
  • 您的测试包含在循环条件评估阶段(int j=0;j
【解决方案2】:

在您的代码中,您有这个重置代码:

if (j==10) {
    sete=0;
} else {
    sete++;
}

但是,j == 10 永远不可能,所以 sete 永远不会重置为 0。我不知道这是否是导致异常的原因,但这绝对是您的代码的问题。条件大概应该是if (j==9) { ...

【讨论】:

    【解决方案3】:

    这两个异常发生是因为倒数第二行:

    seter[antallSeter].addActionListener(lytteren);
    

    在双 for 循环之外,其中 antallSeter 将增加超过现有(1st 异常)或填充(2nd例外)seter 的索引。

    如果我理解正确,并且您想为每个按钮添加一个事件侦听器,您可以更改为:

    // ..
    
        if(j == 10) {
            sete=0;
        } else {              
            sete++; 
        }
    
        seter[antallSeter].addActionListener(new Knappelytter());
    
    }
    rad++;
    // etc ..
    

    【讨论】:

      【解决方案4】:

      在最后一个循环之后,antallSeter 的值为 100。这是该行中越界的索引:

      seter[antallSeter].addActionListener(lytteren);
      

      您可能应该移动这些行:

      Knappelytter lytteren = new Knappelytter();
      seter[antallSeter].addActionListener(lytteren);
      

      在外循环内部。

      【讨论】:

        【解决方案5】:

        用 101 大小初始化设置器。

        public knapp seter[]=new knapp[101];
        

        【讨论】:

        • 包含 100 个按钮的数组不需要 101 个元素的大小
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-15
        • 2015-10-26
        • 2016-01-04
        • 1970-01-01
        相关资源
        最近更新 更多