цикл java вложенный для () создает исключение ArrayIndexOutOfBoundsException - PullRequest
2 голосов
/ 11 мая 2010

Я работаю над упражнением JPanel в книге по Java. Мне поручено создать сетку 5x4 с помощью GridLayout.

Когда я перебираю контейнер для добавления панелей и кнопок, первый метод 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);

}

}

Я уверен, что я перерабатываю простой вложенный цикл. Так как я новичок в Java, пожалуйста, будьте добры. Я уверен, что когда-нибудь верну услугу.

Ответы [ 5 ]

2 голосов
/ 11 мая 2010

JPanel[] rows = new JPanel[i];

i - это 0 в первой итерации, а это не то, что вам нужно. Сделай так:

JPanel[] rows = new JPanel[MAX_ROWS];

Кроме того, я думаю, что вы хотите полностью исключить это из цикла for, поскольку вы, похоже, используете его элементы, которые не были бы инициализированы ...

Это тоже неправильно:

JButton[] buttons = new JButton[i];

i может быть 0, когда j равен 2, например, в этом случае нет такой вещи как buttons[j]. Сделайте их все MAX_*, и я думаю, что вы хотите вывести их из цикла, поскольку я не вижу смысла воссоздавать их на каждой итерации. Также вам необходимо создать отдельные элементы массива.

2 голосов
/ 11 мая 2010

Эта часть не имеет смысла:

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

Вы создаете массив i кнопок JB и пытаетесь добавить j th к 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 голос
/ 11 мая 2010
JPanel[] rows = new JPanel[i];

Когда я равен 0, вы создаете массив с 0 элементами. Затем вы пытаетесь получить доступ к этому массиву, но в нем нет элементов.

0 голосов
/ 11 мая 2010

Похоже, вы создаете слишком много массивов. Вы создаете свои массивы ВНУТРИ циклов, поэтому вместо 5 строк вы создаете 5 строк 5 раз или 25 строк.

Другая проблема заключается в том, что вы на самом деле не создаете никаких объектов, а только массив для хранения объектов. Для каждого объекта в вашем массиве вам нужна еще одна строка "button [j] = new JButton ()".

0 голосов
/ 11 мая 2010

Проблема в том, что ваш массив кнопок имеет размер 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();
}

(отказ от ответственности: код не тестировался, но был извлечен из неизвестного вам места только для примера. Возможны опечатки или невидимые ошибки.)

Удачи.

...