Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Непонятный мне nullpointerexception


Автор: Dzo 29.10.2009, 15:02
Пишу небольшую сетевую игру. Есть непонятная проблема с клеинтовым GUI - вываливается NullPointerException

Сначала код.

clientGUI:

Код

public class ClientGUI {
    
    Client clientTCP;

    private JPanel createEnterNamePanel() {
        
        enterNamePanel = new JPanel();
        
        enterYourNameTxT = new JTextField("Enter your name:", 20);
        enterTheGameButton = new JButton(new StartClientAction(this));
        enterNamePanel.setSize(250, 60);
        enterNamePanel.setLocation(25, 35);
        //enterNamePanel.setBackground(Color.black);
        enterNamePanel.add(enterYourNameTxT);
        enterNamePanel.add(enterTheGameButton);
        enterTheGameButton.setText("Enter the Game");
        
        return enterNamePanel;
    }

    private JPanel createSendWordPanel() {
        
        JPanel sendWordPanel = new JPanel();
        sendWordPanel.setSize(320, 70);
        sendWordPanel.setLocation(0, 200);
        // sendWordPanel.setBackground(Color.pink);
        sendWordPanel.setBorder(BorderFactory.createTitledBorder("Enter your word here"));
        
        enterWordTxT = new JTextField(18);
        enterWordTxT.setEnabled(false);
        sendWordPanel.add(enterWordTxT);
        
        sendWordButton = new JButton(new SendWordAction(this));
        sendWordButton.setText("Send word");
        sendWordButton.setEnabled(false);
        sendWordPanel.add(sendWordButton);
        
        return sendWordPanel;
        
    }

    public void startTCPClient(final String userName) {
        Runnable r = new Runnable() {
            public void run() {
                try {
                    clientTCP = new Client(userName, ClientGUI.this);
                } catch (IOException e) {
                    System.out.println("ERRROR!");
                    System.out.println(e);
                }
            }
        };
        Thread t = new Thread(r);
        t.start();
    }
    
    public void sendWordToServer() {
        clientTCP.hmm = true;
    }

        public static void main(String args[]) {

        Runnable r = new Runnable() {
            public void run() {
                frame = new JFrame("COMN Assignment 1 - Jan Domozilov - 0789133 - Client");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setPreferredSize(new Dimension(300, 150));
                ClientGUI clientGUI = new ClientGUI();
                frame.add(clientGUI.createEnterNamePanel());
                frame.add(clientGUI.createTMPPanel());
                frame.pack();
                frame.setVisible(true);
            }
        };

        SwingUtilities.invokeLater(r);
    }
}


STartClientAction:

Код

import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;


public class StartClientAction extends AbstractAction {
    
    private static final long serialVersionUID = 1L;
    
    private ClientGUI clientGUI;

    public StartClientAction(ClientGUI clientGUI) {
        this.clientGUI = clientGUI;
    }

    public void actionPerformed(ActionEvent e) {
        
        clientGUI.startTCPClient(clientGUI.enterYourNameTxT.getText());
        
    };
}


SendWordAction

Код

import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;

public class SendWordAction extends AbstractAction {
    
    private static final long serialVersionUID = 1L;
    
    private ClientGUI clientGUI;
    
    public SendWordAction(ClientGUI clientGUI) {
        this.clientGUI = clientGUI;
    }
    
    public void actionPerformed(ActionEvent e) {
        clientGUI.sendWordToServer();
    };

}


Теперь описание проблемы:

В теории это работает так. Открывается окно (функция main), там в поле вводится, к примеру, имя, наживается кнопка. Кнопка нажимается вот эта

Код

enterTheGameButton = new JButton(new StartClientAction(this)); 


и следовательно вызывается StartClientAction в котором (смотри код) вызывается

Код

clientGUI.startTCPClient(clientGUI.enterYourNameTxT.getText());


которое отлично работает. Потом на этой же форме появляется другая кнопка, а именно sendWordButton = new JButton(new SendWordAction(this)); и по ее нажатию вызывается соответственно SendWordAction и вооот тут...

clientGUI.sendWordToServer(); - выдает NullPointerException, потому что якобы объект clientTCP вот тут:

clientTCP.hmm = true;

не инициализирован.

Так как же он не инициализирован, если кнопочка, вызывающая StartClientAction была нажат уже черт знает когда. Что я упускаю?

Есть подозрение, что проблема в том, что я что-о вызываю из одного Threada, а что-то из другого.

Спасибо!

Автор: 4EJIOBEK 29.10.2009, 15:25
непонятно, где вызывается метод startTCPClient в котором инициализируется clientTCP!?

Автор: Dzo 29.10.2009, 15:46
Цитата(4EJIOBEK @ 29.10.2009,  15:25)
непонятно, где вызывается метод startTCPClient в котором инициализируется clientTCP!?

Он вызывается по нажатию кнопочки enterTheGameButton в StartClientAction классе, код которого я выложил.

Автор: 4EJIOBEK 29.10.2009, 17:46
поскольку вся картина не видна, есть предположение что проблемы с инициализацией самого сlientTCP(возможно есепшн в конструкторе), могу посоветовать воспользоваться дебаггером чтоб выяснить причину NullPointerException.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)