Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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,我在Java中遇到了一个前所未有的奇怪问题 错误为“无法访问服务器类型的封闭实例。必须使用服务器类型的封闭实例限定分配(例如x.new A(),其中x是服务器的实例)。” 我所评论的那一行就是错误发生的地方 package game; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; impor

我在Java中遇到了一个前所未有的奇怪问题

错误为“无法访问服务器类型的封闭实例。必须使用服务器类型的封闭实例限定分配(例如x.new A(),其中x是服务器的实例)。”

我所评论的那一行就是错误发生的地方

package game;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;

public class Server {

    private static List<ThreadModtagClient> clients;

    class ReceiveDataListener implements SocketListener {

        @Override
        public void dataReceived(ThreadModtagClient client, String data) {

        }   
    }

    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        clients = new ArrayList<ThreadModtagClient>();

        ServerSocket welcomeSocket = new ServerSocket(16567);

        while (true) {
            Socket connectionSocket = welcomeSocket.accept();

            ThreadModtagClient client = new ThreadModtagClient(connectionSocket);
            ReceiveDataListener listener = new ReceiveDataListener(); // <--- this is where the error occurs
            client.addSocketListener(listener);
            clients.add(client);
        }

    }
}

class ThreadModtagClient extends Thread implements SocketThread {

    private BufferedReader inFromClient;
    private DataOutputStream outToClient;

    private Player player;

    private List<SocketListener> listeners;


    public ThreadModtagClient(Socket connection) throws IOException {
        inFromClient = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        outToClient = new DataOutputStream(connection.getOutputStream());
        listeners = new ArrayList<SocketListener>();

    }

    public void addSocketListener(SocketListener listener) {
        listeners.add(listener);
    }

    public void removeSocketListener(SocketListener listener) {
        listeners.remove(listener);
    }

    public Player getPlayer() {
        return player;
    }

    public void setPlayer(Player player) {
        this.player = player;
    }


    public void sendData(String data) throws IOException {
        outToClient.writeChars(data);
    }

    public void run() {

        while (true) {
            try {

                String data = inFromClient.readLine();

                for(SocketListener listener : listeners) {
                    listener.dataReceived(this, data);
                }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch(NoSuchElementException e1) {
                e1.printStackTrace();
            }
        }
    }
}
打包游戏;
导入java.io.BufferedReader;
导入java.io.DataOutputStream;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.NoSuchElementException;
导入java.util.StringTokenizer;
公共类服务器{
私有静态列表客户端;
类ReceiveDataListener实现SocketListener{
@凌驾
接收到公共void数据(ThreadModtagClient客户端,字符串数据){
}   
}
/**
*@param args
*@抛出异常
*/
公共静态void main(字符串[]args)引发IOException{
//TODO自动生成的方法存根
clients=newarraylist();
ServerSocket welcomeSocket=新的ServerSocket(16567);
while(true){
套接字连接Socket=welcomeSocket.accept();
ThreadModtagClient=新的ThreadModtagClient(connectionSocket);

ReceiveDataListener listener=新的ReceiveDataListener();//
服务器。ReceiveDataListener
是一个(非静态)内部类。您正在从静态上下文创建它。您需要提供一个
Server
的实例作为外部实例。但是,几乎可以肯定,您希望
ReceiveDataListener
成为一个静态嵌套类,或者可能是一个外部类。

这是因为您试图从静态方法创建一个ReceiveDataListenerd、 由于ReceiveDataListener不是静态类,因此需要将其附加到服务器实例。

您不能从诸如
main
之类的静态上下文实例化非静态内部类。错误会准确地告诉您需要做什么。ReceiveDataListener是一个非静态内部类,必须通过objec访问外部类(服务器)的t。您有三个选项: 1.听取编译器的建议(通过服务器的对象访问) 2.将ReceiveDataListener设置为静态 3.将ReceiveDataListener拉到单独的.java中并使用它


HTH

如何解决这个问题?我需要一个静态上下文中的类实例。通读上面的答案,它们列出了所有可能的重复