2011-10-26 10 views
27

Me encuentro con un problema extraño en Java en el momento que nunca he visto antes.No hay ninguna instancia adjunta de tipo Servidor accesible

El error es "No se puede acceder a ninguna instancia adjunta de tipo Servidor. Debe calificar la asignación con una instancia adjunta de tipo Servidor (por ejemplo, x.new A() donde x es una instancia de Servidor)."

La línea que he comentado es donde se produce el error.

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(); 
      } 
     } 
    } 
} 
+0

duplicado posible de [Java - Ningún caso encerrando de tipo Foo es accesible] (http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo- is-accessible) – fabian

Respuesta

46

Server.ReceiveDataListener es A (no estático) clase interna. Lo estás creando desde un contexto estático. Debe proporcionar una instancia de Server para que sea la instancia externa. Sin embargo, casi con seguridad desea que ReceiveDataListener sea una clase anidada estática, o probablemente una clase externa.

2

Esto se debe a que está intentando crear un ReceiveDataListener a partir de un método estático, y dado que ReceiveDataListener no es una clase estática, debe adjuntarse a una instancia de Server.

4

No se puede crear una instancia de una clase interna no estática desde un contexto estático como main.

+0

¿Cómo evitar esto? Necesito esa instancia de clase en un contexto estático. –

+0

Lea las respuestas anteriores, enumeran todas las posibilidades – michael667

7

y el error indica exactamente lo que debe hacerse. ReceiveDataListener es una clase interna no estática y debe accederse a través de un objeto de la clase externa (Servidor). Tiene tres opciones: 1. siga los consejos del compilador (acceda a través de un objeto de Servidor) 2. haga ReceiveDataListener estático 3. extraiga ReceiveDataListener en un .java separado y úselo.

HTH

Cuestiones relacionadas