2

私のプログラムで助けていただければ幸いです

    Exception in thread "Thread-4" java.lang.NullPointerException
    at ServerConnect.replyChoice(BaseStaInstance.java:63)
    at ServerConnect.run(BaseStaInstance.java:45)
    at java.lang.Thread.run(Thread.java:619)

私のServerConnect関数は次のようになります:-

class ServerConnect extends Thread {

 Socket skt;
 String sProcessId;
 ServerConnect scnt = null; 
 ObjectOutputStream myOutput;
 ObjectInputStream myInput;


 ServerConnect(){}
 ServerConnect(Socket connection, String sProcessNo) {
  this.skt = connection;
  this.sProcessId = sProcessNo;
 }

 public void run() {
  try {
   myInput = new ObjectInputStream(skt.getInputStream());
   ServerConnect scnt = new ServerConnect();

   while(true) {
    try{
     int ownTimeStamp = Global.iTimeStamp;

     Object buf = myInput.readObject();

     //if we got input, print it out and write a message back to the remote client...
     if(buf != null){
 LINE 45-->     **scnt.replyChoice(buf);**

     }

    }catch(ClassNotFoundException e) {
     e.printStackTrace();
    }
   }
  } catch(IOException e) {
   e.printStackTrace();
  }
 }

 void replyChoice(Object buf){


  try{
LINE 63 --> **myOutput = new ObjectOutputStream(skt.getOutputStream());**


  System.out.println("Server read:[ "+buf+" ]");
  myOutput.writeObject("got it");
  myOutput.flush();

  }catch(IOException e){
  e.printStackTrace();
  }
 }
}

基本的には、ソケット プログラミングとマルチスレッド アプリケーションです。クライアントとサーバーに接続を確立させるために別の端末で実行すると、コードが実行されます。しかし、両方の端末で上記のエラーが発生します。間違った場所で myOutput 変数を宣言したことと関係があります。誰かが私を助けてくれませんか。エラー メッセージから、添付のコードの 63 行目と 45 行目を強調表示しました。

4

3 に答える 3

4
  1. デフォルトのコンストラクターを削除する
  2. インスタンス フィールド (stk および sProcessId) を final にする
  3. コンパイラがどのように不平を言うかを確認し、それらの問題を修正します

これらの指示は、NPE のような実行時エラーをコンパイル時のエラーと交換するのに役立ちます。これは、実行できる最善の方法です。注: このトリックは、一般的に使用するためのものです。

于 2010-02-27T17:09:42.173 に答える
2

オブジェクトは、パラメーターを取らない最初のコンストラクターで初期化されています。その結果、sktは初期化されないため、 ですnull。を呼び出すとskt.getOutputStream()、逆参照できないため、ヌル ポインター例外がスローされますskt

于 2010-02-27T16:54:07.333 に答える
0
 ServerConnect(){}
 ServerConnect(Socket connection, String sProcessNo) {
  this.skt = connection;
  this.sProcessId = sProcessNo;
 }

どのコンストラクタを使用しますか? 原因 skt が初期化されていない可能性があります

//編集 : おやおや、間違ったコンストラクタを使用していることがわかりました

   ServerConnect scnt = new ServerConnect();

   ServerConnect scnt = new ServerConnect(skt,sProcessId);
于 2010-02-27T16:54:27.000 に答える