0

オブジェクトを使用してメッセージを送信しようとしています。GUIを作成するコードと、接続がない場合はサーバーを作成するか、サーバーが利用可能な場合はクライアントとして機能するコードの別のチャンクがあります。ユーザーは GUI を介してメッセージを入力し、「コミュニケーター」を介して「メッセージ」オブジェクトとして送信します。コミュニケーターがクライアントとして設定されている場合、ユーザーはメッセージを送信できますが、サーバーとして設定されている場合は送信できません...

ユーザーがプログラムをサーバーとして設定してメッセージを送信しようとすると、次のエラーが発生します。

スレッド「AWT-EventQueue-0」での例外 java.lang.NullPointerException

そして、メッセージは送信されません

これは、コミュニケーターのコードです。一番下は、メッセージを送信する関数です。

package hunterinstant;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author Chris
 */
public class HunterCom implements Runnable {

    private static String SERVER_IP = "127.0.0.1";
    private static int SERVER_PORT = 5000;
    Scanner scanner = new Scanner(System.in);   //to read text from the console
    Socket socket = null;
    boolean client;
    Conversation window;
    ObjectOutputStream out = null;

    public void initialize(Conversation c, String ip, String port) {
        System.out.println(ip);
        System.out.println(port);
        SERVER_IP = ip;
        SERVER_PORT = Integer.parseInt(port);
        window = c; 
    }



    public void run() {

        try {
            socket = new Socket(SERVER_IP, SERVER_PORT);
            window.addText("Connected to server");
            client = true;
        } catch (Exception ex) {
            window.addText("No Users Online: Waiting for connection");
            client = false;

        }

        if (client == true) {

        ObjectInputStream in = null;
        while (true) {
            try {
                if (out == null) {
                    out = new ObjectOutputStream(socket.getOutputStream());
                }

                //get the reply from the server
                if (in == null) {
                    in = new ObjectInputStream(socket.getInputStream());
                }
                Message message = (Message) in.readObject();

                window.addText(message.getMessage());
                //System.out.println("Server said: " + message.getMessage());

            } catch (Exception ex) {
                window.addText("Error: " + ex);
            }
        }

    } // End Client

        else {
            ServerSocket serverSocket = null;
            try {
                serverSocket = new ServerSocket(SERVER_PORT);
            } catch (IOException ex) {
                window.addText("Error occured while creating the server socket");
                return;
            }

            Socket socket = null;
            try {
                //Waits untill a connection is made, and returns that socket
                socket = serverSocket.accept();
            } catch (IOException ex) {
                window.addText("Error occured while accepting the socket");
                return;
            }
            window.addText("Connection created, client IP: " + socket.getInetAddress());
            ObjectInputStream in = null;
            while (true) {
                try {
                    if (in == null) {
                        in = new ObjectInputStream(socket.getInputStream());
                    }

                    Message message = (Message) in.readObject();

                    window.addText(message.getMessage());
                    if (out == null) {
                        out = new ObjectOutputStream(socket.getOutputStream());
                    }
                } catch (Exception ex) {
                    window.addText("Error: " + ex);
                }
            }
        }
    }

//THIS IS THE CODE THAT IS SUPPOSED TO SEND THE MESSAGE
    public void sendMessage(String str) 
    {
        try {
            out.writeObject(new Message(str));
            System.out.println("Hello");
            out.flush();
        } catch (IOException ex) {
            Logger.getLogger(HunterCom.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

これは、GUI からメッセージを送信することになっているコードです。

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    comunicator.sendMessage(jTextField1.getText());
    jTextArea2.append(jTextField1.getText());
}

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
    if(evt.getKeyCode()==10) // Has the user pressed enter?
    {
        comunicator.sendMessage(jTextField1.getText());
        jTextArea2.append(jTextField1.getText());
    }
}

初心者の質問で申し訳ありません...私はここで本当に明らかに愚かなことをしていると確信していますが、Javaを数か月しかやっておらず、これを理解しようと何時間も費やしました喜びもなく……

4

2 に答える 2

6

時間?ああ、私の。

スタック トレースを読み取ることから始めます。これは、NPE が発生した行番号と .java ソース ファイルを示します。その行に移動し、オブジェクト参照を見て、どれが null かを確認します。

NPE は簡単に修正できます。これは通常、オブジェクトの初期化について誤った仮定をしたために発生します。その参照を適切に初期化する方法を理解する必要があります。スコープ、コンストラクター - 問題が見つかります。

IntelliJ などのまともな IDE を入手し、デバッガーでコードをステップ実行します。数時間ではなく、 10 分で終わります。

個人的には、誰かのために大量のコードをデバッグしたくありません。あなたのものは完全ではないので、コンパイルして実行することはできません。質問にスタック トレースを貼り付けていないため、読むことができません。私たちがあなたを助けるために、あなたはほとんど何もしてくれませんでした。

于 2013-01-05T13:19:06.967 に答える
0
try: while(true&&socket.isConnected()){
                   .....

時折

Message message = (Message) in.readObject(); 

ソケットが接続される前に実行され、NPE がスローされる

于 2014-02-14T16:01:33.310 に答える