Java 我可以访问另一个线程的向量的静态数组列表吗?在这个例子中?

Java 我可以访问另一个线程的向量的静态数组列表吗?在这个例子中?,java,vector,arraylist,static-members,Java,Vector,Arraylist,Static Members,从另一个线程和该线程中的类访问静态向量时出现问题。 一个类是名为LotteryPlay的GUI类,它有一个名为packArray的静态向量,另一个类名为multi-threader,其一部分如下所示,它在不同的线程中运行。有什么问题吗 我能想到的唯一一件事是,我试图从另一个线程访问静态向量。这可能吗 @Override public void run() { try { out = new PrintWriter(socket.getOutputStr

从另一个线程和该线程中的类访问静态向量时出现问题。 一个类是名为LotteryPlay的GUI类,它有一个名为packArray的静态向量,另一个类名为multi-threader,其一部分如下所示,它在不同的线程中运行。有什么问题吗

我能想到的唯一一件事是,我试图从另一个线程访问静态向量。这可能吗

   @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
@覆盖
公开募捐{
试试{
out=新的PrintWriter(socket.getOutputStream(),true);
in=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
System.out.println(“从新线程设置流\n”);
第“”行;
而((line=in.readLine())!=null){
此.messageFromClient(行);
如果(!(计数器>1)){
文本拆分器(行);
socketPack=新的socketPack(套接字、时间戳、地址);

LotteryPlay.packArray.add(socketPack);您得到一个
NullPointerException
的事实表明
LotteryPlay.packArray
为空。在使用它之前,您需要确保它已初始化

如果你真的想把它作为一个静态变量,我强烈建议你把它设为final

public static final Vector<SocketPack> packArray = new Vector<SocketPack>();
public static final Vector packArray=new Vector();
但是,我也建议您重新设计应用程序,以避免需要静态变量。考虑什么需要什么数据,并适当地传递它。静态变量使代码更难推理和测试


另外,请注意,虽然<代码>向量中的每个操作都是单独同步的,但这并不能使它通常是线程安全的。例如,在没有额外同步的情况下,您不能安全地迭代<代码>向量。否则,一个线程可以在迭代时修改它。

java.util.concurrent
中的ons

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

如果你真的想把它作为一个静态变量,我强烈建议你把它设为final

public static final Vector<SocketPack> packArray = new Vector<SocketPack>();
public static final Vector packArray=new Vector();
但是,我也建议您重新设计应用程序,以避免需要静态变量。考虑什么需要什么数据,并适当地传递它。静态变量使代码更难推理和测试


另外,请注意,虽然<代码>向量中的每个操作都是单独同步的,但这并不能使它通常是线程安全的。例如,在没有额外同步的情况下,您不能安全地迭代<代码>向量。否则,一个线程可以在迭代时修改它。

java.util.concurrent

中的ons可能
LotteryPlay.packArray
为空。您在哪里初始化它?(注意,使用静态变量通常不是一个好主意…)它是在另一个类LotteryPlay.java中初始化的,我必须使用static,因为我将客户端-服务器连接的所有套接字对象存储在一个静态向量/数组列表中,这样我就可以从两个类中访问该列表。不,你不必使用静态变量。你只需要更仔细地重新设计,以使适当的ata在任何需要的地方都可用。但是,我怀疑问题确实在于您没有执行初始化代码。不幸的是,由于您没有显示出这一点,很难再确定问题所在。@codeMan:如果它是一个静态最终变量,那么访问该变量是安全的。当然,如何使用该对象是另一回事当然,即使它不是最终的,它仍然“有点安全”-只是,除非有其他同步,否则在一个线程中写入的值在另一个线程中可能不可见。JON,你是对的,我没有在LotteryPlay类中初始化向量,在构造函数中初始化后,它现在可以工作了,没有错误。请以答案的形式给出你的注释,我会检查它。Well大概
LotteryPlay.packArray
为空。您在哪里初始化它?(注意,使用静态变量通常不是一个好主意…)它是在另一个类LotteryPlay.java中初始化的,我必须使用static,因为我将客户端-服务器连接的所有套接字对象存储在一个静态向量/数组列表中,这样我就可以从两个类中访问该列表。不,你不必使用静态变量。你只需要更仔细地重新设计,以使适当的ata在任何需要的地方都可用。但是,我怀疑问题确实在于您没有执行初始化代码。不幸的是,由于您没有显示出这一点,很难再确定问题所在。@codeMan:如果它是一个静态最终变量,那么访问该变量是安全的。当然,如何使用该对象是另一回事当然,即使它不是最终的,它仍然“有点安全”-只是,除非有其他同步,否则在一个线程中写入的值在另一个线程中可能不可见。JON,你是对的,我没有在LotteryPlay类中初始化向量,在我在构造函数中初始化它之后,它现在可以工作了,没有错误。请以答案的形式输入你的注释,我会检查它。