在此线程中从另一个线程和类访问静态向量时遇到问题。 一个类是名为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)
答案 0 :(得分:1)
您收到NullPointerException
这一事实表明LotteryPlay.packArray
为空。在使用之前,您需要确保它已初始化。
如果确实希望将其保留为静态变量,我强烈建议您将其设为final
,例如
public static final Vector<SocketPack> packArray = new Vector<SocketPack>();
但是,我还建议您重新设计应用程序以避免需要静态变量。考虑什么需要什么数据,并适当地传递它。静态变量使代码更难以推理和测试。
此外,请注意尽管Vector
中的每个操作都是单独同步的,但这并不能使它通常是线程安全的。例如,如果没有额外的同步,您无法安全地迭代Vector
,否则一个线程可能会在您进行迭代时对其进行修改。您应该考虑java.util.concurrent
中的集合。