2011-10-26 15 views
27

Sto incontrando un problema strano in Java nel momento in cui non l'ho mai visto prima.Nessuna istanza di tipo server allegata è accessibile

L'errore è "Nessuna istanza di inclusione di tipo Server accessibile. Deve qualificare l'allocazione con un'istanza di tipo Server allegata (ad esempio x.new A() dove x è un'istanza di Server)."

La riga su cui ho commentato è dove si verifica l'errore.

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

Possibile duplicato di [Java - Nessuna istanza allegando di tipo Foo è accessibile] (http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo- è accessibile) – fabian

risposta

46

Server.ReceiveDataListener è una classe interna (non statica). Lo stai creando da un contesto statico. È necessario fornire un'istanza di Server come istanza esterna. Tuttavia, quasi certamente vuoi che ReceiveDataListener sia una classe nidificata statica, o probabilmente una classe esterna.

2

Questo perché si sta tentando di creare un ReceiveDataListener da un metodo statico e poiché ReceiveDataListener non è una classe statica, è necessario collegarlo a un'istanza di Server.

4

Non è possibile creare un'istanza di una classe interna non statica da un contesto statico come main.

+0

Come aggirare questo? Ho bisogno di quell'istanza di classe in un contesto statico. –

+0

Leggete le risposte sopra, elencano tutte le possibilità – michael667

7

bene l'errore indica esattamente ciò che deve essere fatto. ReceiveDataListener è una classe interna non statica e deve essere accessibile tramite un oggetto della classe esterna (Server). Sono disponibili tre opzioni: 1. seguire il consiglio del compilatore (accesso tramite un oggetto di server) 2. make ReceiveDataListener statico 3. tirare ReceiveDataListener fuori ad un .java separata e usarlo.

HTH

Problemi correlati