Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

No enclosing instance of type Server is accessible

Tags:

java

I'm encountering a weird issue in Java at the moment that I've never seen before.

The error is "No enclosing instance of type Server is accessible. Must qualify the allocation with an enclosing instance of type Server (e.g. x.new A() where x is an instance of Server)."

The line I've commented on is where the error occurs.

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();             }         }     } } 
like image 589
Mathias Lykkegaard Lorenzen Avatar asked Oct 26 '11 11:10

Mathias Lykkegaard Lorenzen


People also ask

What does no enclosing instance mean in Java?

The java No enclosing instance of type is accessible. Must qualify the allocation with an enclosing instance of type (e.g. x.new A() where x is an instance of ). exception happens when an instance is created for an inner class in the outer class static method.


2 Answers

Server.ReceiveDataListener is a (non-static) inner class. You are creating it from a static context. You need to supply an instance of Server to be the outer instance. However, almost certainly you want ReceiveDataListener to be a static nested class, or probably an outer class.

like image 99
Tom Hawtin - tackline Avatar answered Sep 22 '22 22:09

Tom Hawtin - tackline


well the error tells you exactly what needs to be done. ReceiveDataListener is a non-static inner class and must be accessed via an object of the outer class (Server). You have three options: 1. take the compiler's advice (access via an object of Server) 2. make ReceiveDataListener static 3. pull ReceiveDataListener out to a separate .java and use it.

HTH

like image 45
aishwarya Avatar answered Sep 21 '22 22:09

aishwarya