• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Null Pointer Exception w kodzie

Object Storage Arubacloud
0 głosów
262 wizyt
pytanie zadane 27 lutego 2018 w Java przez kosttek Początkujący (450 p.)

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 laugh

3 odpowiedzi

+1 głos
odpowiedź 27 lutego 2018 przez Ajver Bywalec (2,430 p.)
wybrane 27 lutego 2018 przez kosttek
 
Najlepsza
Proponuję takie ciało funkcji:

 

 private void initializeFields() {

        fields = new JButton[9];

        for (int i=0; i<9; i++) {

            fields[i] = new JButton();

            fields[i].setFont(buttonFont);

            fields[i].addActionListener(new FieldListener());

            add(fields[i]);

        }

    }

 

To powinno zadziałać.
komentarz 27 lutego 2018 przez kosttek Początkujący (450 p.)

Działa! Dzięki laugh

Możesz mi jeszcze napisać dlaczego? Pętla for each nie powinna przejść po każdym elemencie fields?

komentarz 27 lutego 2018 przez Ajver Bywalec (2,430 p.)

Cieszę się, że działa smiley

Nie jestem w stu procentach pewien, ale wydaje mi się, że field było kopią tablicy fields i działałeś na kopii, a nie na oryginale, dlatego tablica dalej była ustawiona na nulla (domyślnie jest na niego ustawiana).

 

 

+1 głos
odpowiedź 27 lutego 2018 przez Aisekai Nałogowiec (42,190 p.)
0 głosów
odpowiedź 27 lutego 2018 przez ShiroUmizake Nałogowiec (46,300 p.)
Sprawdż czy to nie jest nullem --> fields[first];
komentarz 27 lutego 2018 przez kosttek Początkujący (450 p.)
Sprawdzałem już wcześniej if'em w funkcji checkAdjacent() i wszystkie elementy fields są nullem, a przecież zostały zainicjalizowane w inicjalizeFields().

Podobne pytania

0 głosów
3 odpowiedzi 262 wizyt
pytanie zadane 14 września 2018 w Java przez Pablo93 Użytkownik (800 p.)
0 głosów
2 odpowiedzi 230 wizyt
pytanie zadane 8 listopada 2015 w Java przez Kolboch Bywalec (2,320 p.)
0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 14 października 2019 w Java przez heartagram Obywatel (1,770 p.)

92,577 zapytań

141,426 odpowiedzi

319,653 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...