【问题标题】:EDT and updating status textAreaEDT 和更新状态 textArea
【发布时间】:2013-01-18 12:53:44
【问题描述】:

我想创建新线程(用于服务器)。我有 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)

我的代码: 私人无效 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;
        }
    }
}  

【问题讨论】:

  • 该异常表明您的 Server(int) 构造函数内部存在问题。向我们展示那段代码。

标签: java


【解决方案1】:

Server 构造函数中的这一行没有实例化变量status

status.setStatus("Server Created.");

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


常规Threads 不封装与Event Dispatch Thread 的正确交互。 SwingWorker 在这里会是一个更好的选择。这个post 有一个例子。

除此之外:给定Java code conventionsMainPanelTextPort 将被表示为mainPanelTextPort

【讨论】:

  • 组件 MainPanelTextPort 已初始化。如何在我的代码中使用这个 SwingWorker?
  • 您能否为 Server 类发布 SSCCE 并指出第 16 行发生错误的位置?
  • @user1916866,下次编辑您的问题以显示您的代码。像您这样的外部链接只会让人们感到困惑。您需要使用status = new Status(...) 初始化状态变量,然后才能访问它的成员函数。 Java 不是 C++。
  • 我以前做过。在主类构造函数中
  • @user1916866,你没有。在调用 Server 构造函数之后,您正在调用 server.setStatusObj(status);
猜你喜欢
  • 1970-01-01
  • 2018-11-20
  • 2019-04-05
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 2023-01-28
  • 2020-03-09
相关资源
最近更新 更多