Verliere meinen glauben an Java

Ich habe folgenden Quelltext, der nicht viel anderes macht als einen kleinen Frame anzeigen und wenn man auf das rote X klickt, dann wird das ganze versteckt.

Die Methode public void setVisible(…) steht zwar im Quelltext wird aber nicht aufgerufen (also auch nicht von außerhalb).

Wenn ich jetzt auf das rote X drücke erhalte ich einen java.lang.StackOverflowError allerdings ohne Stacktrace oder sowas mehr als das steht einfach nicht auf meiner Konsole.

Und der Grund warum ich jetzt vom glauben an Java abrücke (ich dachte ich habe Java so ein bisschen verstanden) wenn ich diese Methode entferne dann funktioniert das ohne Fehler.
Und wenn ich die Methode von Public auf Private setze, dann bekomme ich einen CompilerFehler (Cannot reduce the visibility of the inherited method from Component)

so ein bisschen verstehe ich ja, dass ich das nicht so auf invisible setzten kann, aber warum verhält sich Java da so komisch…? Vorallem: Warum bringt er kein Stacktrace und warum ist spielt die Methode überhaupt eine Rolle wenn sie doch gar nicht aufgerufen wird…?

public class CopyOfFrame extends JFrame{

 
 private static CopyOfFrame instance;

 private CopyOfFrame() {

 this.setTitle("Menütitel");

 this.setDefaultCloseOperation(JFrame.HIDE\_ON\_CLOSE);
 this.pack();
 this.show(); 
 }

 public static CopyOfFrame getInstance() {
 if (instance == null) {
 synchronized(StartSeite.class) {
 instance = new CopyOfFrame(); 
 }
 }
 return instance;
 }

 public void setVisible(boolean visible) {
 this.setVisible(visible);

 } 
}
 public void setVisible(boolean visible) {
 this.setVisible(visible);

 } 

Damit rufst du immer und immer und immer wieder
CopyOfFrame.setVisible() auf --> StackOverflow.

Ich denke du wolltest sowas machen:

 public void setVisible(boolean visible) {
 super.setVisible(visible);

 } 

Gruss
Patrick

Ich denke du wolltest sowas machen:

public void setVisible(boolean visible) {
super.setVisible(visible);

}

Stimmt, das gibt Sinn, du kannst gedanken lesen :smile: Aber was ich trotzdem nicht verstehe: Ich rufe die ja gar nicht auf…
Hhm, oder vielleicht doch? Achso. Beim „auf das X klicken“ wird genau diese Methode aufgerufen, oder?
Ok. Ich glaub ich habs verstanden. Ist ja logisch.

Jetzt frage ich mich nur noch warum ich keine Stacktrace bekommen habe…

Jetzt frage ich mich nur noch warum ich keine Stacktrace
bekommen habe…

Falls du Java 1.4.2 verwendest, duerfte dich das interessieren:

http://forum.java.sun.com/thread.jspa?threadID=53705…

Gruss
Patrick

Hi.

Stimmt, das gibt Sinn, du kannst gedanken lesen :smile: Aber was
ich trotzdem nicht verstehe: Ich rufe die ja gar nicht auf…
Hhm, oder vielleicht doch? Achso. Beim „auf das X klicken“
wird genau diese Methode aufgerufen, oder?

Möglicherweise wird das setVisible auch vom this.show() aufgerufen. Laut Java-Dokumentation ist show deprecated und durch setVisible ersetzt. Eventuell ruft show ja intern ebenfalls setVisible auf. Und da du die ursprüngliche setVisible-Methode ja überschreibst, wird dann deine Methode aufgerufen, nicht die vorgegebene.

Sebastian.

zum thema stacktrace
hallo matthias

wie sollte java auch einen stacktrace ausgeben können? dein problem: du hast eine endlosschleife programmiert, die sich ständig selber aufruft. damit schreibst du ständig die bisherige adresse auf den stack und springst zu neuen (die im fall der endlosrekursion identisch ist). der stack hat aber eine fix vorgegebenen grösse (defaultmässig 512 k, kann mit dem parameter -Xss verändert werden). wenn die vm also keine adresse mehr auf den stack legen kann, weil kein platz ist, kommt eben der stackoverflow. um einen stacktrace ausgeben zu können, müsste aber eine subroutine aufgerufen werden, die dann ebenfalls eine adresse auf den stack legen will. ergo: die routine zum stacktraceschreiben kann nicht aufgerufen werden.

ein ähnliches problem hast du, wenn du zuviel speicher am heap allokierst. bekommt ein thread einen outofmemoryerror, versucht die vm auch noch, einen stacktrace zu schreiben. ist aber auch dafür kein platz mehr da, steht auch nur outofmemoryerror auf der console ohne stacktrace.

lg
erwin

Hallo Matthias.

Stimmt, das gibt Sinn, du kannst gedanken lesen :smile: Aber was
ich trotzdem nicht verstehe: Ich rufe JFrame.setVisible()
ja gar nicht auf…
Hhm, oder vielleicht doch? Achso. Beim „auf das X klicken“
wird genau diese Methode aufgerufen, oder?

Du liegst mit Deiner Vermutung richtig, wie der
Quellcode zur Klasse javax.swing.JFrame zeigt.
Der Klick auf das Schliessen-Icon löst ein WindowEvent
aus und landet dann in der folgenden Methode:

 private int **defaultCloseOperation = HIDE\_ON\_CLOSE** ;
 ...
 /\*\* 
 \* Processes window events occurring on this component.
 \* Hides the window or disposes of it, as specified by the setting
 \* of the defaultCloseOperation property.
 \*
 \* @param e the window event
 \* @see #setDefaultCloseOperation
 \* @see java.awt.Window#processWindowEvent
 \*/
 protected void **processWindowEvent** (WindowEvent e) {
 super.processWindowEvent(e);

 if (e.getID() == WindowEvent.WINDOW\_CLOSING) {
 switch(defaultCloseOperation) {
**case HIDE\_ON\_CLOSE:  
 setVisible(false)** ;
 break;
 case DISPOSE\_ON\_CLOSE:
 setVisible(false);
 dispose();
 break;
 case DO\_NOTHING\_ON\_CLOSE:
 default: 
 break;
 case EXIT\_ON\_CLOSE:
 // This needs to match the checkExit call in
 // setDefaultCloseOperation
 System.exit(0);
 break;
 }
 }
 }

Für das nächste Mal hilft Dir auch FAQ:2396 weiter.

Gruß,
-Andreas.