我在Java中遇到了一个奇怪的问题,这是我以前从未见过的.
错误是"无法访问类型为Server的封闭实例.必须使用类型为Server的封闭实例限定分配(例如,xnew A(),其中x是Server的实例)."
我评论过的那一行是错误发生的地方.
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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Tom*_*ine 48
Server.ReceiveDataListener是一个(非静态)内部类.您是从静态上下文创建它.您需要提供一个Server外部实例的实例.但是,几乎可以肯定,您希望ReceiveDataListener成为静态嵌套类,或者可能是外部类.
好的错误告诉你到底需要做什么.ReceiveDataListener是一个非静态内部类,必须通过外部类(Server)的对象进行访问.您有三个选择:1.获取编译器的建议(通过Server的对象访问)2.使ReceiveDataListener静态3.将ReceiveDataListener拉出到单独的.java并使用它.
HTH
| 归档时间: |
|
| 查看次数: |
31729 次 |
| 最近记录: |