2011-10-26 21 views
27

Tôi đang gặp phải một vấn đề lạ trong Java tại thời điểm mà tôi chưa bao giờ thấy trước đây.Không có trường hợp kèm theo của loại Máy chủ có thể truy cập

Lỗi này là "Không có trường hợp kèm theo của loại Máy chủ có thể truy cập. Phải đủ điều kiện phân bổ với một thể hiện kèm theo loại Máy chủ (ví dụ: x.new A() trong đó x là phiên bản của Máy chủ)."

Dòng tôi đã nhận xét là nơi xảy ra lỗi.

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

có thể trùng lặp của [Java - Không dụ kèm theo của loại Foo có thể truy cập] (http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo- có thể truy cập) – fabian

Trả lời

46

Server.ReceiveDataListener là lớp bên trong (không tĩnh). Bạn đang tạo nó từ một bối cảnh tĩnh. Bạn cần cung cấp một thể hiện của Server làm thể hiện bên ngoài. Tuy nhiên, gần như chắc chắn bạn muốn ReceiveDataListener là một lớp lồng nhau tĩnh, hoặc có thể là một lớp bên ngoài.

2

Điều này là do bạn đang cố gắng tạo một ReceiveDataListener từ một phương thức tĩnh và vì ReceiveDataListener không phải là một lớp tĩnh, nó cần phải được gắn vào một cá thể của máy chủ.

4

Bạn không thể khởi tạo lớp bên trong không tĩnh từ ngữ cảnh tĩnh như main.

+0

Làm cách nào để giải quyết vấn đề này? Tôi cần trường hợp lớp đó trong một ngữ cảnh tĩnh. –

+0

Đọc qua các câu trả lời ở trên, họ liệt kê tất cả các khả năng – michael667

7

cũng lỗi sẽ cho bạn biết chính xác những gì cần phải làm. ReceiveDataListener là một lớp bên trong không tĩnh và phải được truy cập thông qua một đối tượng của lớp bên ngoài (Server). Bạn có ba tùy chọn: 1. lấy lời khuyên của trình biên dịch (truy cập thông qua một đối tượng của Máy chủ) 2. làm cho ReceiveDataListener tĩnh 3. kéo ReceiveDataListener ra một .java riêng biệt và sử dụng nó.

HTH

Các vấn đề liên quan