2011-10-26 15 views
27

मुझे इस समय जावा में एक अजीब समस्या का सामना करना पड़ रहा है, जिसे मैंने पहले कभी नहीं देखा था।प्रकार सर्वर का कोई संलग्न उदाहरण सुलभ नहीं है

त्रुटि "सर्वर का कोई संलग्न उदाहरण उपलब्ध नहीं है। सर्वर के एक संलग्न उदाहरण के साथ आवंटन को अर्हता प्राप्त करना चाहिए (उदा। X.new ए() जहां 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

संभावित डुप्लिकेट (http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo- पहुंच योग्य है) – fabian

उत्तर

46

Server.ReceiveDataListener एक (गैर स्थैतिक) आंतरिक वर्ग है। आप इसे एक स्थिर संदर्भ से बना रहे हैं। बाहरी उदाहरण होने के लिए आपको Server का एक उदाहरण प्रदान करने की आवश्यकता है। हालांकि, लगभग निश्चित रूप से आप ReceiveDataListener एक स्थिर नेस्टेड कक्षा, या शायद एक बाहरी वर्ग होना चाहते हैं।

2

ऐसा इसलिए है क्योंकि आप एक स्थिर विधि से एक ReceiveDataListener बनाने की कोशिश कर रहे हैं, और चूंकि ReceiveDataListener एक स्थिर वर्ग नहीं है, इसलिए इसे सर्वर के उदाहरण से जोड़ा जाना आवश्यक है।

4

आप main जैसे स्थिर संदर्भ से एक गैर स्थैतिक आंतरिक कक्षा को तुरंत चालू नहीं कर सकते हैं।

+0

इस के आसपास कैसे जाना है? मुझे उस क्लास इंस्टेंस को एक स्थिर संदर्भ में चाहिए। –

+0

उपरोक्त उत्तरों के माध्यम से पढ़ें, वे सभी संभावनाओं को सूचीबद्ध करते हैं – michael667

7

अच्छी तरह से त्रुटि आपको बताती है कि वास्तव में क्या करने की आवश्यकता है। ReceiveDataListener एक गैर स्थैतिक आंतरिक वर्ग है और बाहरी वर्ग (सर्वर) के किसी ऑब्जेक्ट के माध्यम से पहुंचा जाना चाहिए। आपके पास तीन विकल्प हैं: 1. कंपाइलर की सलाह (सर्वर की ऑब्जेक्ट के माध्यम से एक्सेस) 2. प्राप्त करेंडेटाडेटाइज़र स्थिर 3. रिसीवडेटा लिस्टनर को अलग .java पर खींचें और इसका उपयोग करें।

HTH

[जावा - प्रकार का कोई enclosing उदाहरण फू पहुँचा जा सकता है] की
संबंधित मुद्दे