./WindowApplication.java:57: local variable client is accessed from within inner class; needs to be declared final



  • Habe ein Problem. Und zwar wenn ich auf folgendes übergeordnetes Objekt zugreifen will zeigt er mir die oben genannte Fehlermeldung? Wie kann ich dieses Problem umgehen?

    public void SetObject() {
          passwort = new JTextField();
          anmelden = new JButton("Anmelden");
    
          Socket client = null;
    
          anmelden.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent arg0) {
                try {
                   //Socket wird mit Server-IP und Port-Nummer initialisiert
                   //und baut eine Verbindung zum Server auf
                   client = new Socket("localhost", 4444);
                } 
                catch(IOException e){
                   System.exit(0);
                }
             }
          });
    
          // Positionen festlegen
          passwort.setBounds(5, 10, 100, 25);
          anmelden.setBounds(120, 10, 120 ,25);
    
          // Elemente dem Fenster hinzufügen:
          this.getContentPane().add(passwort);
          this.getContentPane().add(anmelden);
    
          this.pack();
       }
    


  • Gar nicht. Stell dir vor es wird gerade mit dem Socket client gearbeitet und dann kommt in einem anderen Thread der Listener daher und ändert einfach die Referenz client auf einen anderen Socket und beim nächsten Aufruf draußen wird plötzlich woanders hingesendet.

    Mach sowas wie DieKlasse.this.setSocket(newSocket); im Listener und dann kannst du in der setSocket ordentliches synchronize betreiben.

    MfG SideWinder



  • OK danke werde ich versuchen 🙂



  • Ich bekomms nicht ganz hin ^^
    Könntest du mir vielleicht einen Beispielcode geben?



  • Weiß keiner eine Lösung?
    Ich möchte einfach nur im Actionsbereich des Listeners auf die Methode eines übergeordneten Objektes zugreifen da sonst bei jedem Betätigen eine neue Verbindung zusätzlich aufgebaut wird



  • Bei dir wird nichts "zusätzlich" aufgebaut, sondern die alte Verbindung wird überschriben.
    Davon abgesehen steht schon in der Compilermeldung wie man den Fehler behebt (allerdings nur den syntaktischen, nicht den inhärenten architekturellen Fehler)



  • Nein ein Socket ist ein Teil der Verbindung. Über ein Socket kannst du nicht mehere Verbindungen aufbauen.

    public void SetObject() {
          passwort = new JTextField();
          anmelden = new JButton("Anmelden");
    
          final Socket client = new Socket();
    
          anmelden.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent arg0) {
                try {
                   //Socket wird mit Server-IP und Port-Nummer initialisiert
                   //und baut eine Verbindung zum Server auf
                   client.connect(new InetSocketAddress("localhost", 4444));
                }
                catch(IOException e){
                   System.exit(0);
                }
             }
          });
    
          // Positionen festlegen
          passwort.setBounds(5, 10, 100, 25);
          anmelden.setBounds(120, 10, 120 ,25);
    
          // Elemente dem Fenster hinzufügen:
          this.getContentPane().add(passwort);
          this.getContentPane().add(anmelden);
    
          this.pack();
       }
    

Anmelden zum Antworten