0

I want to create new thread (for Server). I have textArea where I put my logs, I created a new class status which handles it. I run new thread for object "server", I try to "deliver" my status object to server and there do status.setStatus("blabal"); But there is a problem....

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Server.<init>(Server.java:16)
at Main.MainPanelButtonStartActionPerformed(Main.java:154)
at Main.access$000(Main.java:9)
at Main$1.actionPerformed(Main.java:63)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:308)
at 

javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:682)
    at java.awt.EventQueue$3.run(EventQueue.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at              java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:696)
    at java.awt.EventQueue$4.run(EventQueue.java:694)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at  java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Exception in thread "Thread-2" java.lang.NullPointerException
    at Server.run(Server.java:23)
    at java.lang.Thread.run(Thread.java:722)
BUILD SUCCESSFUL (total time: 3 seconds)

My code: private void MainPanelButtonStartActionPerformed(java.awt.event.ActionEvent evt) {

    if(!serverCreated) {           
        server = new Server(Integer.parseInt(MainPanelTextPort.getText())); 
        server.setStatusObj(status);
        serverThread = new Thread(server);          
        //SwingUtilities.invokeLater(serverThread); don't know how to use it correctly
        serverThread.start();              
        MainPanelButtonStart.setText("Stop");
        serverCreated = true;
    } else {
        if(!(serverThread.isInterrupted()))
        {
            try {
                server.getServerSocket().close();
            } catch(IOException e) {}

            serverThread.interrupt();
            MainPanelButtonStart.setText("Start");
            serverCreated = false;
        }
    }
}  
Sheppard25
  • 493
  • 1
  • 7
  • 22

1 Answers1

1

The variable status is not instantiated on this line in the Server constructor:

status.setStatus("Server Created.");

Assuming this represents RUNNING, STOPPED, etc. these can be set internally in the Server class as it will be able to determine the run state of the server itself.


Regular Threads do not encapsulate correct interaction with the Event Dispatch Thread. SwingWorker would be a better option here. This post has an example.

Aside: Given Java code conventions, MainPanelTextPort would be represented as mainPanelTextPort.

Community
  • 1
  • 1
Reimeus
  • 158,255
  • 15
  • 216
  • 276
  • Component MainPanelTextPort is initialized. How to use this SwingWorker with my code? – Sheppard25 Jan 18 '13 at 13:10
  • Can you post an [SSCCE](http://sscce.org/) for the class `Server` and indicate line 16 where the error is occurring? – Reimeus Jan 18 '13 at 13:12
  • 1
    @user1916866, next time edit your question to show your code. External links such as yours just confuse people. You need to initialize the status variable with `status = new Status(...)` before you can access it's member functions. Java is not C++. – predi Jan 18 '13 at 13:29
  • I did it before. In Main class constructor – Sheppard25 Jan 18 '13 at 13:32
  • @user1916866, you did not. You are calling `server.setStatusObj(status);` after the call to `Server` constructor. – predi Jan 18 '13 at 13:34
  • Yes my misstake. What a fail. Thanks. – Sheppard25 Jan 18 '13 at 13:39
  • @user1916866 You _could_ pass that variable into the constructor but the `Server` itself should know the run status. See update. – Reimeus Jan 18 '13 at 13:43