jdk - java更新




不能訪問類型為Server的封閉實例 (3)

Server.ReceiveDataListener是一個(非靜態)內部類。 您是從靜態上下文創建它。 您需要提供Server的實例作為外部實例。 但是,幾乎可以肯定,您希望ReceiveDataListener成為靜態嵌套類,或者可能是外部類。

在我從未見過的那一刻,我在Java中遇到了一個奇怪的問題。

錯誤是“無法訪問類型為Server的封閉實例。必須使用類型為Server的封閉實例限定分配(例如xx 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();
            }
        }
    }
}

好的錯誤告訴你到底需要做什麼。 ReceiveDataListener是一個非靜態內部類,必須通過外部類(Server)的對象進行訪問。 您有三個選擇:1。獲取編譯器的建議(通過Server的對象訪問)2。使ReceiveDataListener靜態3.將ReceiveDataListener拉出到單獨的.java並使用它。

HTH


這是因為您嘗試從靜態方法創建ReceiveDataListener,並且由於ReceiveDataListener不是靜態類,因此需要將其附加到Server的實例。





java