1

このスレッドの別のスレッドおよびクラスからの静的ベクターへのアクセスに問題があります。1 つのクラスは LotteryPlay と呼ばれる GUI クラスで、packArray と呼ばれる静的なベクターがあり、別のクラスは MultiThreader と呼ばれ、その一部を以下に示します。異なるスレッドで実行されます。何が間違っているかについてのアイデアはありますか?

私が考えることができる唯一のことは、別のスレッドから静的ベクトルにアクセスしようとしているということです。これは可能ですか?

   @Override
public void run() {
    try {       
        out = new PrintWriter(socket.getOutputStream(), true);   
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

       System.out.println("streams are setup from new thread\n");

            line = "";


            while((line = in.readLine())!= null){

             this.messageFromClient(line);

            if(!(counter > 1)){
                textSplitter(line);
                socketPack = new SocketPack(socket, timeStamp, address);
                LotteryPlay.packArray.add(socketPack);   <<<----NULL POINTER EXCEPTION
                System.out.println("SIZE OF PACKARRAY " + LotteryPlay.packArray.size());
                System.out.println();
                System.out.println("pakc array "+ LotteryPlay.packArray);
            }

            System.out.println("from client: " + line.trim() + "\n");

            }  // end while loop

スレッド「Thread-3」での例外 java.lang.NullPointerException at.com.lotterygame.MultiThreader.run(MultiThreader.java:55) at java.lang.Thread.run(Thread.java:662)

4

1 に答える 1

1

を取得しているという事実は、それが nullであるNullPointerExceptionことを示唆しています。LotteryPlay.packArray使用する前に、初期化されていることを確認する必要があります。

本当に静的変数として保持したい場合は、それを作成することfinalを強くお勧めします。

public static final Vector<SocketPack> packArray = new Vector<SocketPack>();

ただし、静的変数を必要としないようにアプリケーションを再設計することもお勧めします。何がどのデータを必要とするかを考え、適切に渡します。静的変数により、コードの推論とテストが難しくなります。

Vectorさらに、各操作は個別に同期されますが、一般的にスレッドセーフではないことに注意してください。たとえば、Vector追加の同期なしで を安全に反復することはできません。そうしないと、反復中に 1 つのスレッドがそれを変更する可能性があります。のコレクションを検討する必要がありjava.util.concurrentます。

于 2013-03-04T10:14:49.153 に答える