0

にアクセスしようとしています

public static List<ChatThread> Chat_list of my ChatThread Class 

クライアントクラスの run() メソッドからですが、空の配列を取得し続けます(実際には、その時点で例外がスローされますException in thread "Thread-2" java.lang.NullPointerException:)

そして、そのarrayListが存在し、空ではないことは非常に確信しています(ChatThreadクラスのarrayListでテストを行ったため)。私のコードを見てください。何をすべきかについてあなたの助けが必要です。

ありがとう。

これは arrayList を含むクラスです:

public class ChatThread extends Thread {


private Socket sc;
private String cherry_name;
private String passwd;
public static List<ChatThread> Chat_list = new ArrayList<ChatThread>(); //THE STATIC ARRAY LIST
private BufferedReader br;
private BufferedWriter bw;
public ChatThread(Socket sc){
    try {
        this.sc=sc;
        System.out.println(sc);
        br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
        bw = new BufferedWriter(new OutputStreamWriter(sc.getOutputStream()));
        String help = br.readLine();
        this.cherry_name=help.split("@")[0];
        this.passwd=help.split("@")[1];
        System.out.println(this.cherry_name);
        System.out.println(this.passwd);
        Chat_list.add(this); //This is where i add it to the arrayList
        if(Chat_list.isEmpty()) //This is where i did the test
            System.out.println("I am empty");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void run(){
//Comparaison of information with that in the database    
try{
                    bw.write("success");
                    bw.newLine();
                    bw.flush();

            while(true){

            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    }

public Socket getSc() {
    return sc;
}   

public String getCherry_name() {
    return cherry_name;
}


}

Client クラスについては、次のようになります。

public class Client extends Thread {
private Socket socket;
private BufferedReader br;
private BufferedWriter bw;
 private ChatThread th;
 private String cherry_name;
 public Client(String cherry_name,String passwd){
 try
 {
     socket = new Socket("127.0.0.1", 8888);
     this.cherry_name=cherry_name;
     br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
     bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
     bw.write(cherry_name+"@"+passwd);
     bw.newLine();
     bw.flush();
 }
catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("Erreur lors de la lecture du socket");
            e.printStackTrace();
        }
 }
 @SuppressWarnings("deprecation")
public void run()
 { 
        try {
            String help = br.readLine();
     if(help.equals("failed")){
         this.notify();
         this.destroy();
         socket.close();
         }
     else{
         if(ChatThread.Chat_list.isEmpty()) System.out.println("Empty array!!!"); //This is where it says the array is empty whereas it wasn't the case in the ChatThread Class
         for(ChatThread ct : ChatThread.Chat_list){
                    if(cherry_name.equals(ct.getCherry_name())){
                        th=ct;
                        break;
                    }
         }
         while(true){

         }

         }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("Error whilst reading from the socket");
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            System.out.println("Interruption");
            e.printStackTrace();
        }

    }

public Socket getSocket() {
    return socket;
} 
}

そして私のサーバークラス:

public class Server {

public static void main(String[] args) {
    try {
    ServerSocket server =new ServerSocket(8888);
    Socket sc;
    System.out.println("Server Started");
    while(true){
            sc=server.accept();
            System.out.println("New Connection");
            new ChatThread(sc).start();
    }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}
}

Client クラスをインスタンス化するためのメイン クラス:

public class help {

public static void main(String[] argv)  {

new Client("Jerry","Smith").start(); 
}

}
4

1 に答える 1

2

2 つのスレッド間で共有される変更可能なオブジェクトへのすべてのアクセスは、同期された方法でアクセスする必要があります。同期しないと、ご覧のように可視性と一貫性の問題が発生します。

そのようなものを公開するべきではありませんArrayList(複数のスレッドがなくても、パブリックな静的可変オブジェクトはすでに非常に悪い習慣です)。代わりに、独自のオブジェクトにカプセル化し、すべてのアクセスが適切に同期されるようにする必要があります。

コードの行を見ずに、より具体的なアドバイスをすることは困難です。

于 2013-01-06T15:24:11.177 に答える