我可以访问另一个线程的Vector的静态Arraylist吗?在这个例子中?

时间:2013-03-04 09:47:45

标签: java vector arraylist static-members

在此线程中从另一个线程和类访问静态向量时遇到问题。 一个类是名为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

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

1 个答案:

答案 0 :(得分:1)

您收到NullPointerException这一事实表明LotteryPlay.packArray为空。在使用之前,您需要确保它已初始化。

如果确实希望将其保留为静态变量,我强烈建议您将其设为final,例如

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

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

此外,请注意尽管Vector中的每个操作都是单独同步的,但这并不能使它通常是线程安全的。例如,如果没有额外的同步,您无法安全地迭代Vector,否则一个线程可能会在您进行迭代时对其进行修改。您应该考虑java.util.concurrent中的集合。