probleme mit variablen eines Objects

Status
Nicht offen für weitere Antworten.

PrinzMartin

Aktives Mitglied
Moin Moin

ich habe eine Klasse, in der die Butten Actions stehen, im Konstruktor wird ein Objekt (client) der Klasse cClient erstellt.

dann rufe ich wenn ich auf den "connect" Button klicke, die Methode client.connect(); auf.
in cClient gibt es ein Objekt Socket socket;

in der Methode wird jetzt mit socket = new Socket(...) ein socket erstellt (klappt auch wunderbar.)

wenn ich jetzt aber auf den Button "send" klicke, wird die Methode client.send(); aufgerufen.
Da das ja eine Methode des gleichen Objektes ist, dachte ich, auch "socket" währe dann bekannt, "socket" ist aber "null".

ich hänge noch mal beide klassen als Code an und hoffe, dass ich da nur nen dummen Fehler gemacht habe, danke schon mal fürs eventuelle drüberschauen.....


cInteraktion
Code:
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 15.10.2007
  * @author
  */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.*;
import java.io.*;
import java.net.*;

public class cInteraktion extends JButton
{

  // Anfang Variablen
  JTextArea ta_eingabe;
  JTextArea ta_ausgabe;
  JTextField tf_status;
  cClient client;
  Socket socket;
  // Ende Variablen

  // Anfang Ereignisprozeduren
  public cInteraktion(JTextArea pTa_eingabe, JTextArea pTa_ausgabe, JTextField pTf_status)
  {
    this.ta_eingabe = pTa_eingabe;
    this.ta_ausgabe = pTa_ausgabe;
    this.tf_status = pTf_status;
    client = new cClient();
  }
  
  public void btn_connectActionPerformed(ActionEvent evt)
  {
    client.connect(ta_eingabe, ta_ausgabe, tf_status);
  }

  public void btn_disconnectActionPerformed(ActionEvent evt)
  {

  }

  public void btn_sendActionPerformed(ActionEvent evt)
  {
    client.send(ta_eingabe, ta_ausgabe, tf_status);
  }
  // Ende Ereignisprozeduren
}




und cClient
Code:
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 15.10.2007
  * @author
  */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.*;
import java.io.*;
import java.net.*;

public class cClient
{

  // Anfang Variablen
  BufferedReader in;
  String msg;
  Thread read;
  Socket socket;
  // Ende Variablen

  // Anfang Ereignisprozeduren
  public cClient()
  {

  }
  
  public void connect(JTextArea pTa_eingabe, JTextArea pTa_ausgabe, JTextField pTf_status)
  {
    try {
          socket = new Socket("localhost", 1234);
          pTa_ausgabe.setText(String.valueOf(socket));
          pTf_status.setText("connected...");
          pTf_status.setBackground(Color.GREEN);
          read = new Thread(new tRead(pTa_ausgabe, socket));
          read.start();
        } catch(IOException e)
        {
          pTf_status.setText("disconnected...");
          pTf_status.setBackground(Color.RED);
        }
  }
  
  public void send(JTextArea pTa_eingabe, JTextArea pTa_ausgabe, JTextField pTf_status)
  {
    pTa_ausgabe.setText(String.valueOf(socket)+"hallo");         //**************hier wird dann null ausgegeben
  }

  // Ende Ereignisprozeduren
}
 
ein Fehler ist nicht direkt ersichtlich,
möglich wäre z.B. dass du dich in unterschiedlichen cInteraktion- und damit auch in unterschiedlichen cClient-Objekten befindest,

wie du aber weißt kann es gar nichts einfacheres geben, als solche Fehler selber zu finden,

beim Erstellen:
System.out.println("erstelle Socket in Objekt "+hashCode()+": "+socket);

beim send dann:
System.out.println("Socket in Objekt "+hashCode()+" ist: "+socket);
 
ich korrigiere,

wie ich aber J E T Z T weiß :wink: hash code hab ich bisher noch nie gehört geschweige denn benutzt^^ gibt mir das also scheinbar an, in welchem objekt ich mich befinde?

außerdem könntest du recht haben mit den unterschiedlichen Interaktion klassen, ich werde jetzt mal ganz am anfang in der Gui schon ein socket erstellen und dann immer übergeben als Parameter oder gibt es ne andere möglichkeit eine variable in allen instanzen als gleich zu setzen?

in dem Bereich passieren mir echt oft Fehler

aber danke sehr hilft auf jeden Fall weiter :toll:
 
es gibt andere Möglichkeiten (Stichwort Singleton), zentrale Erzeugung und Verteilung ist aber gar nicht so falsch,

falls dir das irgendwann für mehrere zu verteilende Objekte zu bunt wird, dann eine Klasse Configuration oder ähnlich erstellen
 
Naja so schlimm ist es noch nicht aber ich hab immer noch das selber Problem, obwohl ich eigentlich dachte, ich hätte den socket jetzt immer übergeben. Allerdings dürfte es hier ja ok sein, dass mir der hashCode() verschiedene Objekte anzeigt.

Ich hab mal gedacht ich nehme socket.hashCode() aber das gibt ne null pointer exception, was ja klar ist wenn socket Null ist also gefunden hab ich den Fehler noch nciht^^

ich such aber mal weiter der Quelltext ist son bissal unübersichtlich, da das son Learning by doing Projekt ist....




wo liegt eigentlich der unterschied ob ich this.socket = schreibe oder nur socket...

zum beispiel wenn ich ein Parameter pSocket habe und möchte jetzt den socket der klasse, gleich dem übergebenen setzen, damit beide klassen den gleichen haben....

ist es da egal was ich nehme?
 
OK ich denke ich kriege es jetzt hin ich hab mir so ne Englische seite zu deinem Singleton vorschlag durchgelesen und das ist ja total einfach :shock: hat ich gar nicht gedacht^^

jetzt stell ich mein Programm darauf um und hoffe, dass das dann klappt und ich werde es in Zukunft dauernd benutzen ...


also danke noch mal
 
PrinzMartin hat gesagt.:
jetzt stell ich mein Programm darauf um und hoffe, dass das dann klappt und ich werde es in Zukunft dauernd benutzen
Besser nicht. Singletons haben einen ganz klaren Zweck, dass ein Objekt nur einmal existieren darf. Dieser Use-Case exisitiert zwar, ist aber höchst selten. In allen anderen Fällen wird ein Singleton zum Antipattern das sich später bitter rächt.
Singleton ist das am häufigsten missbrauchte Design-Pattern...
 
dürfte aber dies mal durchaus zutreffen, da mein Client ja nur genau EINE verbindung zum Server hat und auch kein zweites socket bestehen darf, da das ja nicht mehr ankommen würde.........

also so wie ich das verstanden habe erfüllt das meine Anforderung in diesem Falle ...

Oder hab ich was falsch verstanden...


PS:
Ich hab keine ahnung was Design Pattern geschweige denn Pattern überhaupt sind ich glaub ich muss nach diesem Projekt viel nacharbeiten da is so viel neues drin, von dem mir die Hintergründe komplett unklar sind^^ :cry:
 
PrinzMartin hat gesagt.:
dürfte aber dies mal durchaus zutreffen, da mein Client ja nur genau EINE verbindung zum Server hat und auch kein zweites socket bestehen darf, da das ja nicht mehr ankommen würde.........
Dann stellt sich doch automatisch die Frage warum ein singleton und nicht einfach static?

PS: Unter einem Design Pattern versteht man ein erprobte Klassenarchitektur für ein allgemeines, wiederkehrendes Problem in der Softwareentwicklung.
 
also bei mir gab es folgendes Problem...

Mein Projekt war undurchdacht ein Learning by Doing Projekt was sich immer wieder geändert hat.

Dann brauche ich diese eine Socket Verbindung in allen möglichen Klassen... und jede Instanz braucht natürlich die gleiche verbindung...

jetzt stelle ich diese verbindung einfach in dem Singleton bereit und hole ihn mir über die Instanz und dann änder oder benutz ich ihn....

mit static hab ich noch nie was gemacht müsst ich mir mal anschauen aber was ich da so drüber gehört habe, löst das doch mein Problem nicht oder?.....
 
PrinzMartin hat gesagt.:
mit static hab ich noch nie was gemacht müsst ich mir mal anschauen aber was ich da so drüber gehört habe, löst das doch mein Problem nicht oder?.....
Wie hast denn dann das Singleton implementiert?
 
Hehe ich sag ja ich nutze in dem Programm einige Teile, deren Hintergründe ich nicht kenne.... für mich war die Erklärung im Internet schlüssig dass durch das private da niemend aus ner anderen Klasse ne Instance erzeugen kann und dann hab ich das Beispiel so übernommen und es sieht jetzt so aus:

Code:
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 15.10.2007
  * @author
  */


import java.io.PrintWriter;

import java.net.Socket;



public class cSingleton
{
  // Anfang Variablen
    Socket socket;
    PrintWriter out;
    
    private static cSingleton instance = new cSingleton();
  // Ende Variablen
    /**
     * Default-Konstruktor, der nicht außerhalb dieser Klasse
     * aufgerufen werden kann
     */
    private cSingleton() {}
  // Anfang Ereignisprozeduren
    /**
     * Statische Methode, liefert die einzige Instanz dieser
     * Klasse zurück
     */
    public static cSingleton getInstance()
    {
        return instance;
    }

  // Ende Ereignisprozeduren
}



naja ich habs also mehr oder weniger übernommen wenn das Projekt dann mal komplett läuft, dann werde ich mir genau anschauen was ich da eigentlich Fabriziert habe....

was genau das static da oben bewirkt ist mir nicht direkt klar^^

Aber momentan lässt die Performance zu wünschen übrig nur der Server + ein Client bringen das kleine Fernsehfenster oben in der ecke schon zum Ruckeln :cry: dabei hab ich doch nur insgesamt 3 Threads...

naja mal sehen was da noch kommt, momentan bin ich dabei auch ne möglichkeit zu bieten wieder zu disconnecten....
 
Wildcard hat gesagt.:
PrinzMartin hat gesagt.:
dürfte aber dies mal durchaus zutreffen, da mein Client ja nur genau EINE verbindung zum Server hat und auch kein zweites socket bestehen darf, da das ja nicht mehr ankommen würde.........
Dann stellt sich doch automatisch die Frage warum ein singleton und nicht einfach static?
wie soll man denn sonst ein Singleton darstellen, wenn nicht mit einer statischen Variable?/ ist nicht jede statische Variable ein Singleton?
 
SlaterB hat gesagt.:
wie soll man denn sonst ein Singleton darstellen, wenn nicht mit einer statischen Variable?/ ist nicht jede statische Variable ein Singleton?
Ist sicherlich eine Definitionsfrage - das Singleton-Pattern bezieht sich ja auf eine Klasse:
Gang of Four hat gesagt.:
Ensure a class has only one instance, and provide a global point of access to it.
Die Tatsache, dass eine Instanz einer Klasse in einer statischen Variablen abgelegt ist, macht die entsprechende Klasse noch nicht zum Singleton - für den Verwender ist das aber ziemlich egal (besonders, wenn die statische Variable auch noch final ist).
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben