2017-02-19 4 views
0

Итак, у меня есть программа tictactoe, и я хочу свести к минимуму количество кода с помощью arrayList и для циклов для моих кнопок и прослушивателей действий. Ошибка компиляции отсутствует, но когда я запускаю ее, она говорит об этом.Ошибка Java: игра TicTacToe с arrayList для кнопок

java.lang.NullPointerException 
at Board.<init>(Board.java:40) 
at Board.main(Board.java:166) 

Это ошибка, которую показывает BlueJ. Во всяком случае, вот мой код. Я подозреваю, что это имеет какое-то отношение к переменным экземпляра и массиву. Пожалуйста, помогите, я пытался исправить это в течение двух дней. Ошибка направляет меня на эту строку.

for(int i=0; i<=buttonsList.size(); i++){ 

Вот код.

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.util.ArrayList; 

//Created class the extends JFrame, and implements action listener 
public class Board extends JFrame implements ActionListener 
{ 
//Instance variables 
private JButton b1, b2, b3, b4, b5, b6, b7, b8, b9, reset; 
private ArrayList<JButton> buttonsList; 

//'playerO' uses the letter 'O', not the number zero 
Icon playerO = new ImageIcon("images/playerO.jpg"); 
Icon playerX = new ImageIcon("images/playerX.jpg"); 
Icon playerN = new ImageIcon("images/reset.jpg"); 

//Instance variable to determine player turn 
boolean firstPlayer = true; 

//Constructor 
public Board() 
{ 
    //Title of Frame 
    super("Gui7 - TicTacToe || Jose Reyes"); 

    //Created container and set the layout 
    Container c = getContentPane(); 
    c.setLayout(new BorderLayout()); 

    //Created a panel, and set the layout 
    JPanel gridPanel = new JPanel(); 
    gridPanel.setLayout(new GridLayout(3,3)); 

    //Created new JButtons and added them to the array list 
    for(int i=0; i<=buttonsList.size(); i++){ 
     JButton jBut = new JButton(playerN); 
     buttonsList.add(jBut); 
    } 

    //Created reset button and title 
    reset = new JButton("Play Again?"); 

    //Added buttons to panel with for loop 
    for(int i=0; i<=buttonsList.size(); i++){ 
     gridPanel.add(buttonsList.get(i)); 
    } 

    //Added panel and reset button to container 
    c.add(gridPanel); 
    c.add(reset, BorderLayout.PAGE_END); 

    //Added Action Listeners with loop 
    for(int i=0; i<=buttonsList.size(); i++){ 
     buttonsList.get(i).addActionListener(this); 
    } 

    //Added action listener to reset button 
    reset.addActionListener(this); 

    //Set the window size and set visibility 
    setSize(600,600); 
    setVisible(true); 
} 

//ActionEvents 
public void actionPerformed(ActionEvent e) 
{ 
    //Grab source 
    Object src = e.getSource(); 

    for (int i = 0; i<=buttonsList.size(); i++){ 
     if(src == buttonsList.get(i)){ 
      if(firstPlayer){ 
       buttonsList.get(i).setIcon(playerO); 
       firstPlayer = false; 
      } else { 
       buttonsList.get(i).setIcon(playerX); 
       firstPlayer = true; 
      } 
     } 
    } 


    //Reset button icons with loop 
    if(src == reset){ 
     for (int i = 0; i < 9; i++){ 
      buttonsList.get(i).setIcon(playerN); 
     } 

     firstPlayer = true; 
    } 

} 

//Main method 
public static void main (String args[]) 
    { 
     Board t = new Board(); 
     t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

ответ

1

Вы никогда не создать ArrayList экземпляр для buttonList, вы просто создать пустой (null) ссылку на переменную.

Измените это назначение переменной, чтобы создать экземпляр ArrayList.

private ArrayList<JButton> buttonsList = new ArrayList<JButton>(); 

EDIT

Я считаю, что вы тогда получите OutOfMemoryException здесь:

//Created new JButtons and added them to the array list 
for(int i=0; i<=buttonsList.size(); i++){ 
    JButton jBut = new JButton(playerN); 
    buttonsList.add(jBut); 
} 

В каждой итерации, необходимо добавить кнопку, и ArrayList size будет расти до бесконечности, пока вы не являетесь ООМ. Не знаю, что именно вы пытаетесь, но, может быть, просто подумайте о логике здесь.

+0

Эй, это, кажется, исправляет первый вопрос, но теперь он говорит об этом. java.lang.OutOfMemoryError: пространство кучи Java. Я обновлю исходное сообщение, чтобы показать ошибку –

+1

, обновленную с ответом на вашу ошибку OOM –

+0

Эй, спасибо за решение первой проблемы !!! Кто-то помог со вторым !!! –

1
for(int i=0; i<=buttonsList.size(); i++){ 
    JButton jBut = new JButton(playerN); 
    buttonsList.add(jBut); 
} 

Я предполагаю, что это источник вашего OutOfMemoryError. i никогда не будет больше buttonslist.size(), потому что каждый раз через цикл вы добавляете еще одну кнопку и, следовательно, увеличиваете размер!

+0

СПАСИБО !!!!!!!! Я не могу отметить это чеком, потому что первый парень решил вопрос на вопрос. Извините, но я буду голосовать за все. Благодаря!!!!! –

+0

Я сейчас не понимаю. Я установил его в i <9, и он работает, спасибо !!!!!!! –

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