OOP Klassen Methoden Rückgabewert

  • Themenstarter Themenstarter vandewey87
  • Beginndatum Beginndatum
V

vandewey87

Gast
Hello!

Der Inhalt eines JPanels von der Klasse AufbauProg wird durch einen Rückgabewert von der Klasse OnOfflineTest mit setText geändert.
Hab ein Problem mit der Rückgabe von diese Zeile zustandonoff = ping.sentDaten();
Der Rückgabewert is immer false - bei Aufruf von sent Daten wird x1 immer false gesetzt... (Schuld Variablendeklaration in Klasse!?)
x1 - in der Run Methode hat immer den richtigen Zustand


Java:
public class AufbauProg extends JPanel {
OlineOfflineTest ping = new OlineOfflineTest();
public void ErzeugeFenster(){
Timer timer = new Timer();
timer.schedule (new OlineOfflineTest(), 0,2000);
}

public void getDaten()
{
  zustandonoff = ping.sentDaten();!!!!!!!!!!!!!

  System.out.println("!!!!!zustandoff!!!!!"+zustandonoff); 

  if(zustandonoff==true)
  {ON.setText("OFFLINE");System.out.println("\n"+"ROT1"+zustandonoff);
  }
  else if(zustandonoff==false)
  {ON.setText("ONLINE");System.out.println("\n"+"Green1"+zustandonoff);
  }
}


Java:
public class OlineOfflineTest extends TimerTask
{

boolean x1=true;
boolean x;

public void run()
{
    x1 = getDaten();
    System.err.println("11111111111111111111"+x1);
}

public boolean sentDaten()
{   
    System.err.println("222222222222222222222"+x1);
    return x1;           !!!!!!!!!!!!!!!!!!
}

public boolean getDaten()
{
   try {
       InetAddress address1 = InetAddress.getByName("www.timetoparty.at");
       try{
        if(address1.isReachable(1500))
            {
        x=true;
           }
        else{
        x=false;
        }
         }catch (IOException e) {
       System.err.println("Unable to reach www.timetoparty");}

      }
     catch (UnknownHostException e) {
       System.err.println("Unable to lookup www.timetoparty1");

     }
     catch (IOException e) {
       System.err.println("Unable to reach www.timetoparty2");
     }
  
  return x;
}



}
 
Sry, Eintrag ist mir doppelt "rausgerutscht"!

Ja Inet Verbindung ist vorhanden bzw. trenne ich sie physikalisch zum Testen!

Die run Methode gibt mir den richtigen wert aus jedoch die sent Daten() - nach Aufruf nicht aus und nicht in die andere klasse
nach Methodenaufruf zurück!

Java:
public void run()
{
    x1 = getDaten();
    System.err.println("11111111111111111111"+x1);
}
 
public boolean sentDaten()
{   
    System.err.println("222222222222222222222"+x1);
    return x1;           !!!!!!!!!!!!!!!!!!
}
 
Danke den aufruf hab ich jetzt geändert!
Wenn die Methode in der Klasse AufbauProg aufrufe stimmt der Rückgabewert jetzt -
wenn ich sentDaten() aber über die OnOffline Methode aufrufe hauts wieder nicht hin
Java:
public void run()
{   
    x1 = getDaten();
    System.err.println("11111111111111111111"+x1);

    AufbauProg aktualisiere = new AufbauProg();
    aktualisiere.getDaten();
}

public boolean sentDaten()
{   
    System.err.println("222222222222222222222"+x1); 
    return x1;
}
 
was ist denn 'die OnOffline Methode'?
und was ist der neue Code-Ausschnitt, ist das die geänderte OlineOfflineTest-Klasse?

ziemlich gefährliche Rekursion, die du dann einbaust:
ein AufbauProg erzeugt ein OlineOfflineTest, darin wird ein neues AufbauProg erzeugt, welches dann wieder OlineOfflineTest erstellt, wieder AufbauProg usw. bis in alle Ewigkeit

----

hast du meinen ursprünglichen Hinweis auch verstanden oder nur kopiert?
jetzt hast du bestimmt wieder denselben Fehler,
wenn du verschiedene Objekte erzeugst, ist in einem vielleicht x1 = true gesetzt, in anderen aber nicht,

baue in deine System.out.println noch +hashCode() ein, dann siehst du jeweils, welches Objekt aktuell untersucht wird
 
Hoff ich hab das verstanden, aber das unendlich ist gewollt OnOfflineTest
soll mit an die AufbauProg immer einen Wert zurückgeben der Anzeigt ob
das Programm online ist oder nicht....

Wenn ich mit dem Button in der selben Klasse die Methode aurfufe funktiniert die ON/Off änderung...
hoff hab jetzt die wichtigen Infos gebracht!?

Java:
-
public class OlineOfflineTest extends TimerTask
{

public boolean x1=true;
private boolean x;

public void run()
{   
    x1 = getDaten();
    System.err.println("11111111111111111111"+ x1+hashCode());
    AufbauProg aktualisiere = new AufbauProg();
    aktualisiere.getDaten();
}

public boolean sentDaten()
{   
    System.err.println("222222222222222222222"+ x1+hashCode());
    return x1;
}

public boolean getDaten()
{
   try {
       InetAddress address1 = InetAddress.getByName("www.timetoparty.at");
       try{
        if(address1.isReachable(1500))
            {
        x=true;
           }
        else{
        x=false;
        }
         }catch (IOException e) {
       System.err.println("Unable to reach Server");}

      }
     catch (UnknownHostException e) {
       System.err.println("Unable to lookup Server");

     }
     catch (IOException e) {
       System.err.println("Unable to reach Server");
     }
 
  return x;
}
}


Java:
public class AufbauProg extends JPanel {

public void getDaten()
{
  zustandonoff = ping.sentDaten();
  System.out.println("!!!!!zustandoff!!!!!"+ zustandonoff); //immer false obwohl bei onffstatus OK
  if(zustandonoff==true)
  {ON.setText("OFFLINE");System.out.println("\n"+"ROT1"+zustandonoff);
  }
  else if(zustandonoff==false)
  {ON.setText("ONLINE");System.out.println("\n"+"Green1"+zustandonoff);
  }
}

public void AddActionListenerMethod(){

ActionListener al = new ActionListener() {
@Override public void actionPerformed( ActionEvent e ) {   
    aufruf.LadeBilder("Erdgeschoß");
    getDaten();
}
};
Knopf.addActionListener( al );

}
 
diesmal hast du bei AufbauProg den früheren Code ErzeugeFenster() usw. weggelassen, das ist hinderlich weil ich nicht weiß,
was du änderst/ was noch da ist und nur aus Lesbarkeit weggelassen ist usw.,

in AufbauProg hast du immer noch ping, aber ping ist nirgendwo definiert, deshalb gehe ich mal von Weglassen aus

------

OlineOfflineTest ist erstmal die Klasse überhaupt, die boolean getDaten() am besten berechnen kann,

wieso steht in dessen run-Methode eine Erzeugung von AufbauProg:
> AufbauProg aktualisiere = new AufbauProg();
> aktualisiere.getDaten();

wieso wird auf diese Weise getDaten() abgefragt und nicht die eigene Methode?
ein OlineOfflineTest-Objekt A erzeugt sich auf diese Weise jedenfalls ein AufbauProg-Objekt B

was macht AufbauProg-Objekt B? es erzeugt ping, ein zweites OlineOfflineTest-Objekt C,
C ist was anderes als A, es gibt jetzt verschiedene Objekte von OlineOfflineTest, mit verschiedenen x1-Variablen usw.

siehst du soweit schon das Problem? abgesehen davon C jetzt wieder ein AufbauProg D erzeugt, dieses dann wieder ein OlineOfflineTest E, F, G, H usw..

aber bleiben wir erstmal bei A, B, C,
interessant an obigen Aufruf
> AufbauProg aktualisiere = new AufbauProg();
> aktualisiere.getDaten();
ist nämlich, dass von AufbauProg-Objekt B sofort nach dem Konstruktor Daten abgefragt werden,
AufbauProg hat natürlich keine Ahnung von dem boolean-Wert, leitet diesen Aufruf an C weiter, fragt sentDaten() ab,
dieses sentDaten() von C wird false zurückgeben, denn getDaten() wird erst in der TimerTask-Methode sehr viel später ausgeführt,

das wirst du sicherlich nicht verstehen, viele komplizierte Faktoren kommen zusammen,
konzentriere dich erstmal auf meine erste Frage: warum sollte OlineOfflineTest, welches selber doch am besten Bescheid weiß,
ein AufbauProg-Objekt erzeugen?
 
Thx - für deine Erklärung!

Meine Gedanken:
AufbauProg-Objekt wird erzeugt damit ich die Methode getDaten Methode aufrufen kann
- damit sich diese den Wert von der Klasse OnLineOfflineTest holt (diese ist Klasse erbt von Timer Task
damit diese die Runnable Methode implentieren kann und diese - eine Zeitlich abfrage startet?!
->timer.schedule (ping, 0,2000);

Das mit dem Objekt ist mir auch ungefähr klar - definiere ich diese jedoch wie folgt gibt es einen StackOverflow.

Java:
public class OlineOfflineTest extends TimerTask
{

AufbauProg aktualisiere = new AufbauProg();

public boolean x1=true;
private boolean x;

public void run()
{   
    x1 = getDaten();
    System.err.println("11111111111111111111"+ x1+hashCode());

    
    aktualisiere.getDaten();
}
}

Exception in thread "main" java.lang.StackOverflowError

Frage am Rande: brauch ich ein klass die von timer task erbt damit ich eine
zeitlich abfrage machen kann oder könnte ich dieses innerhalb der AufbauProg auch
in der Art umsetzen?
 
Zuletzt bearbeitet von einem Moderator:
> AufbauProg-Objekt wird erzeugt damit ich die Methode getDaten Methode aufrufen kann
> - damit sich diese den Wert von der Klasse OnLineOfflineTest holt

WER ist denn hier derjenige, der AufbauProg-Objekt erzeugt?
dem Code nach ist es OnLineOfflineTest und wenn man den Satz damit vervollständigt:
"OnLineOfflineTest erzeugt AufbauProg-Objekt damit Wert von OnLineOfflineTest geholt wird"
dann besteht nach wie vor meine von dir unbeantwortete Frage: WARUM diese Schleife, dieser Kreis?

wenn AufbauProg OnLineOfflineTest benutzt, dann sollte die Gegenrichtung tunlichst vermieden werden, in der OnLineOfflineTest-Klasse sollte AufbauProg nicht auftauchen, warum auch?

dass es einen StackOverflowError gibt sage ich doch die ganze Zeit,
vorher hattest du das nur in der run-Methode, die vielleicht erst nach 20 sec startet, so dass es Stunden bis Jahre dauert, bis genügend Objekte gegenseitig erzeugt werden,
jetzt steht der Kreislauf direkt im Konstruktor, nach wenigen ms sind tausende Objekte erzeugt und die Aufrufhierarchie voll

zeitlich warten kannst du auch mit Thread.sleep(20000);
kann sein dass es damit schon besser wird, aber ich verstehe nach wie vor die Grundstruktur nicht
 
Wenn ich mir das ganze so aus den Codefragmenten zusammenreime, erzeugst Du aus einem Objekt heraus einen Thread/Timer, der wiederrum ein Instanz der den Timer erzeugenden Klasse erzeugt, die wiederum einen Thread/Timer erzeugt, der wiederrum ein Instanz der den Timer erzeugenden Klasse erzeugt, die wiederum einen Thread/Timer erzeugt, der wiederrum ein Instanz der den Timer erzeugenden Klasse erzeugt, die wiederum einen Thread/Timer erzeugt, der wiederrum ein Instanz der den Timer erzeugenden Klasse erzeugt, die wiederum einen Thread/Timer erzeugt...
Kein Wunder, dass da irgendwann mal ein Stackoverflow auftritt ;-)
Vielleicht beschreibst Du mal, was Du vorhast, dann könnte man Dir eine richtige Vorgehensweise empfehlen - denn Deine ist definitv falsch.
 
OK, das mit den Objekte erzeugen in den zwei Klassen und das sich die dann quasi gegenseitig aufrufen - hab ich jetzt geschnallt- werd ich unterlassen !

Das Problemm ist wie bekomm ich ann aber die Info von X1 aus der OnlineOfflineTest (wo der Wert zeitlich aktualisiert wird) in die Klasse in AufbauProg? Aufbau Prog brauch diese Information dann zum Anzeigen der Panels....

Könnt ich mir den die OnlineOfflineTest Methode sparen und den Code überhaupt ins Aufbau Prog einbinden?
 
Weiss zwar immer noch nicht was genau Du vorhast, aber wenn Du innerhalb des Threads/Timers Zugriff auf das aufrufende Objekt brauchst (um z.B. Informationen zu aktualisieren) musst Du dem Thread/Timers eine Referenz auf dieses übergeben. Da hatte es auch nichts geholfen, ein neues Objekt vom selben Typ zu erzeugen.
 
so ist es bestimmt gemeint:
Java:
public class Test {
    public static void main(String[] args)  {
        new AufbauProg();
    }
}

class AufbauProg {
    private OnlineOfflineTest ping = new OnlineOfflineTest(this);

    public AufbauProg()  {
        Timer timer = new Timer();
        timer.schedule(ping, 0, 2000);
    }

    public void work() {
        boolean x = ping.getDaten();
        System.out.println("AufbauProg, work: " + x);
    }
}

class OnlineOfflineTest   extends TimerTask {
    private AufbauProg ap;
    private boolean x;

    public OnlineOfflineTest(AufbauProg ap)  {
        this.ap = ap;
    }

    public void run()  {
        x = Math.random() < 0.5;
        System.out.println("OnlineOfflineTest: setze x " + x);
        ap.work();
    }

    public boolean getDaten() {
        return x;
    }
}
 
Das mit der Referenz, werd ich mir mal ansehen

Falls nicht probier ich mit dieser Methode in der AufbauProg Klasse:
Sie ruft mir in einem bestimmten Intervall meine Rückgabe auf
Java:
public void Methode()
    {
    Timer t = new Timer();

      t.schedule(new TimerTask(){

         @Override
         public void run() {
            System.out.println("timer"+System.currentTimeMillis());
            zustandonoff = ping.sentDaten();
         }

      }, 0, 5000);
    }
 
Danke für deine Hilfe!!!! - klappt jetzt alles nach wie ich wollt ! (Code ist jetzt überarbeitet)
 

Zurück
Oben