Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将数组列表的元素从另一个类复制到另一个类_Java - Fatal编程技术网

Java 如何将数组列表的元素从另一个类复制到另一个类

Java 如何将数组列表的元素从另一个类复制到另一个类,java,Java,我的程序在执行过程中遇到错误,因为NewServer中的arrlist元素没有复制到MyConnection。我该怎么办 MyConnection负责发送和获取消息,并负责将消息分发给所有客户端 public class MyConnection extends Thread{ Socket s; BufferedReader in; PrintWriter out; String reps, msg; ArrayList<MyConnection&

我的程序在执行过程中遇到错误,因为NewServer中的arrlist元素没有复制到MyConnection。我该怎么办

MyConnection负责发送和获取消息,并负责将消息分发给所有客户端

public class MyConnection extends Thread{
    Socket s;
    BufferedReader in;
    PrintWriter out;
    String reps, msg;
    ArrayList<MyConnection> arrlist;


    MyConnection(Socket s, ArrayList<MyConnection> arrlist){
        this.arrlist = arrlist;
        this.s = s; 

        try{
            this.in= new BufferedReader(new InputStreamReader(s.getInputStream()));
            this.out= new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
        }catch(IOException e){
            System.out.println("Something Bad Happened " + e);
        }
    }


    boolean sendMessage(String msg){

        try{
            NewServer server = new NewServer();
            server.sendtoAll(msg);
            out.println(msg);
            out.flush();   
             System.out.println(server.arrlist.size());
            return true;


        }catch (Exception e) {
            System.out.println("S: Something bad happened :(");
            e.printStackTrace();
            return false;
        }
    }
    String getMessage(){
        try{          

            reps = in.readLine();


        }catch (Exception e) {
            System.out.println("S: Something bad happened :(");
            e.printStackTrace();
        }


            return reps;
     } 
}
公共类MyConnection扩展线程{
插座;
缓冲读取器;
打印输出;
字符串重复,msg;
ArrayList;
MyConnection(套接字s、ArrayList和arrlist){
this.arrlist=arrlist;
这个.s=s;
试一试{
this.in=new BufferedReader(new InputStreamReader(s.getInputStream());
this.out=新的PrintWriter(新的OutputStreamWriter(s.getOutputStream());
}捕获(IOE异常){
System.out.println(“发生了不好的事情”+e);
}
}
布尔sendMessage(字符串消息){
试一试{
NewServer server=新的NewServer();
server.sendtoAll(msg);
out.println(msg);
out.flush();
System.out.println(server.arrlist.size());
返回true;
}捕获(例外e){
System.out.println(“S:发生了不好的事情:(”);
e、 printStackTrace();
返回false;
}
}
字符串getMessage(){
试试{
reps=in.readLine();
}捕获(例外e){
System.out.println(“S:发生了不好的事情:(”);
e、 printStackTrace();
}
返回代表;
} 
}
这是新闻服务器

public class NewServer{
static ArrayList<MyConnection> arrlist = new ArrayList<MyConnection>();
static boolean push;
static Socket s;

public void sendtoAll(String message){

    for(int i= arrlist.size(); i >= 0; i--){
        MyConnection t3 = arrlist.get(i);
        t3.sendMessage(message);
        if(!t3.sendMessage(message)){
            arrlist.remove(i);
            System.out.println("Client disconnected");
        }
    }

}
public static void main(String args[]){
    try{
        System.out.println("S: Starting server...");
        ServerSocket ssocket = new ServerSocket(8888);
        System.out.println("S: Waiting for connections...");

        while(true){

            s = ssocket.accept();
            System.out.println("SOMEONE CONNECTEDDDDD" + arrlist.size());
            MyConnection t = new MyConnection(s,arrlist);
            arrlist.add(t); //put my connection to arrlist
            t.start();

        }

    }catch(Exception e) {
        System.out.println("Soooomething Bad Happened " + e);
    }
}
公共类新闻服务器{
静态ArrayList arrlist=新ArrayList();
静态布尔推;
静态插座;
public void sendtoAll(字符串消息){
对于(int i=arrlist.size();i>=0;i--){
MyConnection t3=arrlist.get(i);
t3.发送消息(消息);
如果(!t3.sendMessage(消息)){
删除(i);
System.out.println(“客户端断开”);
}
}
}
公共静态void main(字符串参数[]){
试一试{
System.out.println(“S:启动服务器…”);
ServerSocket ssocket=新的ServerSocket(8888);
System.out.println(“S:等待连接…”);
while(true){
s=ssocket.accept();
System.out.println(“SOMEONE connectedddd”+arrlist.size());

MyConnection t=新的MyConnection(s,arrlist); add(t);//将我的连接放到arrlist t、 start(); } }捕获(例外e){ System.out.println(“发生了错误”+e); } }
您将无法编辑正在迭代的列表,您可以执行以下操作:

public void sendtoAll(String message){
    ArrayList<MyConnection> tempArrlist = new ArrayList<MyConnection>()
    for(int i= arrlist.size(); i >= 0; i--){
        MyConnection t3 = arrlist.get(i);
        t3.sendMessage(message);
        if(t3.sendMessage(message)){
            tempArrlist.add(arrlist.get(i));
        } else {
             System.out.println("Client disconnected");
        }
    }
    arrlist = tempArrlist;
}
public void sendtoAll(字符串消息){
ArrayList tempArrlist=新建ArrayList()
对于(int i=arrlist.size();i>=0;i--){
MyConnection t3=arrlist.get(i);
t3.发送消息(消息);
如果(t3.发送消息(消息)){
tempArrlist.add(arrlist.get(i));
}否则{
System.out.println(“客户端断开”);
}
}
arrlist=tempArrlist;
}

也许我遗漏了什么-但是我在代码中找不到任何地方可以将对象放入arraylist。仅仅创建一个空的arraylist并不会神奇地将对象放入arraylist。旁注:在
sendtoAll
中迭代arrlist的方式是不好的做法。只需使用
for(MyConnection con:arrlist){
这种“downcouting”方法给人类读者增加了很多潜在的困惑;为了(非常小的)性能提升。不要这样做。MyConnection t=新的MyConnection(s,arrlist);arrlist.add(t);您调试过代码吗?请尝试使用调试器。@EddyG a for each循环将导致从列表中删除某些内容。因此,这很可能不是最好的做法