java嵌套for()循环抛出ArrayIndexOutOfBoundsException

时间:2010-05-11 19:33:21

标签: java exception jpanel

我正在Java书中完成JPanel练习。我的任务是使用GridLayout创建一个5x4网格。

当我遍历容器以添加面板和按钮时,第一个add()会抛出OOB异常。我做错了什么?

package mineField;

import java.awt.*;
import javax.swing.*;

@SuppressWarnings("serial")

public class MineField extends JFrame {

private final int WIDTH = 250;
private final int HEIGHT = 120;
private final int MAX_ROWS = 5; 
private final int MAX_COLUMNS = 4;

public MineField() {

    super("Minefield");

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Container mineFieldGrid = getContentPane();
    mineFieldGrid.setLayout(new GridLayout(MAX_ROWS, MAX_COLUMNS));

    // loop through arrays, add panels, then add buttons to panels.
    for (int i = 0; i < MAX_ROWS; i++) {
        JPanel[] rows = new JPanel[i];

        mineFieldGrid.add(rows[i], rows[i].getName());
        rows[i].setBackground(Color.blue);

        for (int j = 0; j < MAX_COLUMNS; j++) {
            JButton[] buttons = new JButton[i];             
            rows[i].add(buttons[j], buttons[j].getName());
        }
    }

    mineFieldGrid.setSize(WIDTH, HEIGHT);
    mineFieldGrid.setVisible(true);

}

public int setRandomBomb(Container con)
{

    int bombID;

    bombID = (int) (Math.random() * con.getComponentCount());
    return bombID;


}
/**
 * @param args
 */
public static void main(String[] args) {

    //int randomBomb;
    //JButton bombLocation;

    MineField minePanel = new MineField();
    //minePanel[randomBomb] = minePanel.setRandomBomb(minePanel);

}

}

我确定我过度设计了一个简单的嵌套for循环。由于我是Java新手,请善待。我相信有一天我会回报你的帮助。

5 个答案:

答案 0 :(得分:2)

这部分没有意义:

  for (int j = 0; j < MAX_COLUMNS; j++) {
        JButton[] buttons = new JButton[i];
        rows[i].add(buttons[j], buttons[j].getName());
  }

您正在创建一个i JButton数组,并尝试将j添加到rows,这没有任何意义,如果j >= i无效。你可能打算这样做:

  JButton[] buttons = new JButton[MAX_COLUMNS];
  for (int j = 0; j < MAX_COLUMNS; j++) {
        rows[i].add(buttons[j], buttons[j].getName());
  }

但是数组仍然不包含任何按钮,你所做的就是初始化它。根本没有阵列的理由;这实际上有效:

  for (int j = 0; j < MAX_COLUMNS; j++) {
        JButton button = new JButton("foo");
        rows[i].add(button, button.getName());
  }

答案 1 :(得分:2)

JPanel[] rows = new JPanel[i];

第一次迭代中

i为0,这不是您想要的。那个:

JPanel[] rows = new JPanel[MAX_ROWS];

另外,我认为你想在for循环之外完全采用它,因为你似乎正在使用它的未初始化的元素......

这也是错误的:

JButton[] buttons = new JButton[i];

例如,当i为2时,

j可以为0,在这种情况下,不存在buttons[j]这样的事情。使它们全部MAX_*并且我认为你想把它们从循环中取出来,因为我没有看到在每次迭代中重新创建它们的重点。此外,您还需要实例化各个数组元素。

答案 2 :(得分:1)

JPanel[] rows = new JPanel[i];

当i为0时,您创建一个包含0个元素的数组。然后,您尝试访问该数组,但它中没有元素。

答案 3 :(得分:0)

问题是您的按钮阵列大小为i,但j可能大于i。例如,第一次,你在这里制作一个空数组:

JButton[] buttons = new JButton[i];

因为我等于0.然后你尝试在索引0处访问它,这不存在(因为数组没有大小)并且你得到了你的异常。你应该做的事情是:

JButton[] buttons = new JButton[MAX_COLUMNS];

这样,每个阵列位置都有一个按钮。此外,您可能需要初始化各个按钮 - 例如:

for (int k = 0; k < MAX_COLUMNS; k++) {
    buttons[k] = new JButton();
}

(免责声明:代码未经过测试,但仅在示例目的的情况下退出了您的位置。可能存在拼写错误或看不见的错误。)

祝你好运。

答案 4 :(得分:0)

看起来你正在创建太多数组。你是在循环中创建数组,所以不是创建5行,而是创建5行5次或25行。

另一个问题是你实际上并没有创建任何对象,只有数组来保存对象。对于数组中的每个对象,您需要另一个“button [j] = new JButton()”行。