0

新しいスレッドを作成したい(サーバー用)。ログを置くテキストエリアがあり、それを処理する新しいクラスステータスを作成しました。オブジェクト「サーバー」の新しいスレッドを実行し、ステータスオブジェクトをサーバーに「配信」しようとすると、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 に答える