Подтвердить что ты не робот

Нет доступного экземпляра типа Server.

В настоящий момент я сталкиваюсь с какой-то странной проблемой на 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();
            }
        }
    }
}
4b9b3361

Ответ 1

Server.ReceiveDataListener - (нестатический) внутренний класс. Вы создаете его из статического контекста. Вам нужно предоставить экземпляр Server для внешнего экземпляра. Однако почти наверняка вы хотите, чтобы ReceiveDataListener был статическим вложенным классом или, возможно, внешним классом.

Ответ 2

Ну, ошибка говорит вам, что именно нужно делать. ReceiveDataListener - это нестатический внутренний класс и должен быть доступен через объект внешнего класса (Server). У вас есть три варианта: 1. принять совет компилятора (доступ через объект сервера) 2. Сделать ReceiveDataListener статическим 3. вытащите ReceiveDataListener в отдельную .java и используйте его.

НТН

Ответ 3

Вы не можете создать нестатический внутренний класс из статического контекста, например main.

Ответ 4

Это связано с тем, что вы пытаетесь создать ReceiveDataListener из статического метода, и поскольку ReceiveDataListener не является статическим классом, его необходимо привязать к экземпляру Server.