没有封闭的服务器types的实例是可访问的

在我以前从未见过的时候,我遇到了Java中的一个奇怪的问题。

错误是“没有可以访问服务器types的封闭实例,必须使用封闭的Servertypes实例来限定分配(egxnew 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(); } } } } 

Server.ReceiveDataListener是一个(非静态的)内部类。 您正在从静态上下文创build它。 您需要提供一个Server实例作为外部实例。 但是,几乎可以肯定你想让ReceiveDataListener成为一个静态的嵌套类,或者可能是一个外部类。

这个错误告诉你到底需要做什么。 ReceiveDataListener是一个非静态的内部类,必须通过外部类(Server)的对象来访问。 你有三个select:1.接受编译器的build议(通过服务器对象访问)2.使ReceiveDataListener静态3.将ReceiveDataListener拉出到单独的.java中并使用它。

HTH

你不能像main一样从静态的上下文中实例化一个非静态的内部类。

这是因为你试图从一个静态方法创build一个ReceiveDataListener,并且由于ReceiveDataListener不是一个静态类,所以它需要被连接到一个Server实例。