0

我想创建新线程(用于服务器)。我有 textArea 放置日志的地方,我创建了一个新的类状态来处理它。我为对象“服务器”运行新线程,我尝试将我的状态对象“交付”到服务器,然后 status.setStatus("blabal"); 但有个问题....

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)

我的代码: 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;
        }
    }
}  
4

1 回答 1

1

该变量status未在Server构造函数的这一行上实例化:

status.setStatus("Server Created.");

假设这表示RUNNING,STOPPED等。这些可以在Server类内部设置,因为它将能够确定服务器本身的运行状态。


常规Threads不封装与Event Dispatch Thread. SwingWorker在这里会是一个更好的选择。这篇文章有一个例子。

旁白:给定Java 代码约定MainPanelTextPort将表示为mainPanelTextPort

于 2013-01-18T13:01:16.520 回答