嘿即时通讯与Java Messenger应用程序有问题。我在netbeans和服务器和客户端类中做了一个简单的GUI。当我在gui中创建服务器的新实例时,我启动了一个新线程并开始在其中监听。当服务器得到某些东西并进入handleConnection()时,我想在另一个类和另一个线程(GUI)的JTextPane上使用setText()时,就会发生问题。这是代码:

gui类中的connect按钮的代码:

private void doConnect(java.awt.event.ActionEvent evt) {

        server = new mServer(1234);
        ms = new mServer(this);
        Thread t = new Thread(server);
        t.start();
        statusLine.setText("Connection established");
    }


服务器类:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nejc;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;

/**
 *
 * @author Nejc
 */
public class mServer implements Runnable{

    private int port;

    JMessenger jMsg;

    public mServer(int port){

    this.port=port;
    }

    public mServer(JMessenger in){

        jMsg = in;
    }

    public void listen(){

        try{

            ServerSocket listener = new ServerSocket(port);
            Socket server;

            while(true){

                server = listener.accept();
        handleConnection(server);
            }

        }
    catch (IOException ioe){

            System.out.println("IOException: " + ioe);
            //ioe.printStackTrace();
            System.exit(1);
    }
    }

    protected void handleConnection(Socket server) throws IOException{

        //DataOutputStream out = new DataOutputStream(server.getOutputStream());
    final DataInputStream in = new DataInputStream(server.getInputStream());

        Runnable r = new Runnable(){

            @Override
            public void run(){

                try{

                    jMsg.field.setText("Mitja: " + in.readUTF());
                }
                catch (IOException ex){

                    Logger.getLogger(mServer.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        SwingUtilities.invokeLater(r);


    //out.writeUTF(output);

        /*JTextPane field = jMsg.field;
        String mssg = in.readUTF();
        field.setText(mssg);
        *
        */

    server.setKeepAlive(true);
    }

    @Override
    public void run(){

        listen();
    }
}


对不起,我忘记了这一点:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at com.nejc.mServer$1.run(mServer.java:70)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
    at java.awt.EventQueue.access$000(EventQueue.java:101)
    at java.awt.EventQueue$3.run(EventQueue.java:666)
    at java.awt.EventQueue$3.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

最佳答案

您正在创建mServer的两个实例servermsserverjMsgnull,所以我希望您在NullPointerException方法中得到一个run

更新

记下Marko关于不从GUI线程上的输入流读取的答案。

07-28 03:28
查看更多