【问题标题】:No enclosing instance of type Server is accessible无法访问 Server 类型的封闭实例
【发布时间】:2011-12-15 15:51:47
【问题描述】:

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

错误是“没有 Server 类型的封闭实例可访问。必须使用 Server 类型的封闭实例来限定分配(例如 x.new A(),其中 x 是 Server 的实例)。”

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

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


【解决方案1】:

这个错误会准确地告诉你需要做什么。 ReceiveDataListener 是一个非静态内部类,必须通过外部类 (Server) 的对象进行访问。你有三个选择: 1. 接受编译器的建议(通过服务器对象访问) 2. 将 ReceiveDataListener 设为静态 3. 将 ReceiveDataListener 拉到一个单独的 .java 中并使用它。

HTH

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如何解决这个问题?我需要在静态上下文中的类实例。
    • 通读上面的答案,他们列出了所有的可能性
    【解决方案3】:

    这是因为您尝试从静态方法创建 ReceiveDataListener,并且由于 ReceiveDataListener 不是静态类,因此需要将其附加到 Server 的实例。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2016-11-20
        • 2013-04-11
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2013-02-17
        相关资源
        最近更新 更多