1

从该线程中的另一个线程和类访问静态向量时遇到问题。一个类是名为 LotteryPlay 的 GUI 类,它有一个名为 packArray 的静态 Vector,另一个类是 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

java.lang.Thread.run(Thread.java:662) 处的线程“Thread-3”java.lang.NullPointerException at.com.lotterygame.MultiThreader.run(MultiThreader.java:55) 中的异常

4

1 回答 1

1

你得到的事实NullPointerException表明这LotteryPlay.packArray是空的。在使用它之前,您需要确保它已被初始化。

如果您真的想将其保留为静态变量,我强烈建议您制作它final,例如

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

但是,我还建议您重新设计应用程序以避免需要静态变量。想想什么需要什么数据,并适当地传递它。静态变量使代码更难推理和测试。

此外,请注意,虽然每个操作Vector都是单独同步的,但这并不意味着它通常是线程安全的。例如,您不能在Vector没有额外同步的情况下安全地迭代 a,否则一个线程可能会在您迭代时修改它。您可能应该考虑java.util.concurrent.

于 2013-03-04T10:14:49.153 回答