2013-10-01 2 views
0

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

В принципе, я пытаюсь создать «таблицу» целочисленных полей, чтобы я мог использовать их, чтобы найти, все ли значения в целочисленных полях создают магический квадрат. Вложенный цикл for должен создавать до квадрата 8x8, и он будет создавать первую строку квадрата, но вместо этого он дает мне ошибку за пределами границ.

Ошибка возникает внутри цикла вложенного цикла, где я добавляю IntegerField к графическому интерфейсу.

Если кто-то может помочь, это было бы здорово. Дайте мне знать, если вам нужно больше деталей.

import javax.swing.*; 
import BreezySwing.*; 

public class Interface extends GBFrame{ 
    //Create integerField array to create input for magic square 
    public IntegerField[][] magicSquare; 
    //Create input button, integer field which sets size of square 
    public IntegerField squareSize; 
    public JButton inputSize; 
    //Create check square button 
    public JButton checkSquare; 
    //Label to output if there is a magic square 
    public JLabel squareLabel; 
    //Size of square variable 
    public int size; 

    //CalcSquare object 
    CalcSquare calc = new CalcSquare(); 

    //Constructor for Square interface 
    public Interface() 
    { 
     squareSize = addIntegerField (0, 1, 1, 1, 1); 
     inputSize = addButton ("Input Size", 2, 1, 1, 1); 
     squareLabel = addLabel ("", 3, 1, 1, 1); 
     checkSquare = addButton ("Check Square", 4, 1, 1, 1); 
    } 
    //Creates IntegerFields on the GUI as needed. 
    public void createFields() 
    { 
     for (int i = 0; i <= size; i++) 
     { 
      for (int x = 0; x <= size; x++) 
      { 
       magicSquare = new IntegerField[i][x]; 
    } 
     } 
    } 

public void buttonClicked(JButton buttonObj) 
{ 
     if (buttonObj == inputSize) 
     { 
      size = squareSize.getNumber(); 
      createFields(); 
      for (int i = 0; i <= size; i++) 
      { 
       for (int x = 0; x <= size; x++) 
       { 
        magicSquare[i][x] = addIntegerField (0, i+1, x+1, 1, 1); 
       } 
      } 
     } 
     else if (buttonObj == checkSquare) 
     {  
     } 
    } 
} 
+0

Что странно относительно 'OutOfBoundsException'? Массивы имеют 0-индексы. –

+2

Почему вы делаете это 'magicSquare = new IntegerField [i] [x];' внутри цикла? – John3136

ответ

2

А при условии петли i <= size должны всегда поднимать красные флаги, так как если я == размер, вы вышли за пределы размера массива или коллекции. Обратите внимание, что массивы и коллекции основаны 0 и перейти от 0 до размера - 1.

Он должен вместо этого почти всегда i < size

+0

Спасибо, кучка, знал, что это было что-то глупое. – user2833078

0

Все ваши петли итерация ДО размера, которые будут вызывать ArrayIndexOutOfBoundException. Индекс массива начинается с 0 до size-1. Вот один такой цикл в коде:

for (int i = 0; i <= size; i++) 

вам нужно перебирать цикл только до размера

for (int i = 0; i < size; i++) 

Правильные другие петли соответственно

+0

Знал, это было что-то глупое. Я попробую и отчитаю. – user2833078

+0

Спасибо, знал, что это было что-то глупое. – user2833078

0

size никогда не инициализированы. И ваш <= должен быть < в цикле for.

Фактически, если вы используете size в качестве константы, чтобы установить размер ваших массивов, вы должны использовать i < size - 1 в циклах for.

Смежные вопросы