2011-10-26 61 views
27

我在Java中遇到了一個我從未見過的奇怪問題。沒有可以訪問服務器類型的封閉實例

錯誤是「沒有可以訪問服務器類型的封閉實例,必須使用封閉的Server類型實例來限定分配(例如,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(); 
      } 
     } 
    } 
} 
+0

[爪哇 - 類型的無封閉情況foo是接近]的可能的複製(http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo-是可訪問的) – fabian

回答

46

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

2

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

4

您不能從類似main的靜態上下文中實例化非靜態內部類。

+0

如何解決這個問題?我需要在靜態上下文中的類實例。 – 2014-03-17 16:01:55

+0

通讀上面的答案,他們列出了所有的可能性 – michael667

7

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

HTH

相關問題