Witam, ma ktoś pomysł dlaczego wyrzuca mi NPE w funkcji checkAdjacent(), skoro tablica fields jest zainicjalizowana w inicjalizeFields()?
import javax.swing.*;
import java.awt.*;
public class TicTacToe{
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
JFrame frame = new JFrame("Tic Tac Toe");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new GameLogic());
frame.pack();
frame.setVisible(true);
});
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class GameLogic extends JPanel {
private static final Font buttonFont = new Font("Dialog", Font.BOLD, 80);
private String player;
private JButton[] fields;
public GameLogic() {
setLayout(new GridLayout(3, 3));
player = "X";
initializeFields();
}
private void initializeFields() {
fields = new JButton[9];
for (JButton field : fields) {
field = new JButton();
field.setFont(buttonFont);
field.addActionListener(new FieldListener());
add(field);
}
}
private boolean checkGameOver() {
//check horizontal
if (checkAdjacent(0, 1, 2))
return true;
else if (checkAdjacent(3, 4, 5))
return true;
else if (checkAdjacent(6, 7, 8))
return true;
//check vertical
else if (checkAdjacent(0, 3, 6))
return true;
else if (checkAdjacent(1, 4, 7))
return true;
else if (checkAdjacent(2, 5, 8))
return true;
//check diagonal
else if (checkAdjacent(0, 4, 8))
return true;
else if (checkAdjacent(2, 4, 6))
return true;
return false;
}
private boolean checkAdjacent(int first, int second, int third) {
return !fields[first].getText().equals("")
&& fields[first].getText().equals(fields[second].getText())
&& fields[first].getText().equals(fields[third].getText());
}
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 600);
}
private class FieldListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
JButton clickedButton = (JButton) event.getSource();
if (clickedButton.getText().equals("")) {
clickedButton.setText(player);
if (player.equals("X"))
player = "O";
else
player = "X";
}
if (checkGameOver())
JOptionPane.showMessageDialog(null, "Winner: " + player);
}
}
}
Błąd po kliknięciu na przycisk:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at GameLogic.checkAdjacent(GameLogic.java:54)
at GameLogic.checkGameOver(GameLogic.java:29)
at GameLogic.access$200(GameLogic.java:6)
at GameLogic$FieldListener.actionPerformed(GameLogic.java:77)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:269)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6578)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3343)
at java.desktop/java.awt.Component.processEvent(Component.java:6343)
at java.desktop/java.awt.Container.processEvent(Container.java:2259)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4961)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2317)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4793)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4539)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4480)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2303)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2758)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4793)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:766)
at java.desktop/java.awt.EventQueue.access$500(EventQueue.java:97)
at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:717)
at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:711)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:89)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:99)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:739)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:737)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:89)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:736)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:199)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Z góry dzięki za pomoc