Nuke
12-11-2006, 17:26
Hi.
Ich lerne mich gerade ein bisschen in Java ein und seh gerade nicht durch.
Ich habe gelesen das die finalize-Methode immer aufgerufen wird. Das mag ja schon sein, aber wird auch der GabageCollector (der ja finalize aufruft) immer aufgerufen? Es geht um das beenden des Programms.
Hab jetzt z.B. folgenden Code für den main-Part (hab eigentlich ein Datenbank-Projekt, aber der Code wäre jetzt zu lang).
package myPack;
public class start {
/**
* @param args
*/
public void doIt() {
MyClass c = new MyClass();
c.setMyInt(1232423);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
start a = new start();
a.doIt();
}
}
In MyClass steht:
package myPack;
public class MyClass {
int myInt;
public int getMyInt() {
return myInt;
}
public void setMyInt(int a) {
this.myInt = a;
}
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
System.out.println("Das ist ein Test");
super.finalize();
}
}
So. Beim Durchlauf des Programms wird die Meldung "Das ist ein Test" nicht angezeigt. Warum?
Bei meinem Datenbank-Projekt wird so nämlich die Verbindung zur Datenbank nicht sauber beendet, wenn ich "close" nicht explizit aufrufe (entsprechender Log-Eintrag "LOG: unexpected EOF on client connection" beweist das).
Wenn ich nach a.doIt(); ein System.gc(); mache, dann ist alles in Ordnung.
Kann mir das mal bitte einer erklären?
P.S.: Ja ich weiß das ich darauf achten sollte "close" aufzurufen, aber es geht mir jetzt um's Prinzip. ;)
Danke. :)
Ich lerne mich gerade ein bisschen in Java ein und seh gerade nicht durch.
Ich habe gelesen das die finalize-Methode immer aufgerufen wird. Das mag ja schon sein, aber wird auch der GabageCollector (der ja finalize aufruft) immer aufgerufen? Es geht um das beenden des Programms.
Hab jetzt z.B. folgenden Code für den main-Part (hab eigentlich ein Datenbank-Projekt, aber der Code wäre jetzt zu lang).
package myPack;
public class start {
/**
* @param args
*/
public void doIt() {
MyClass c = new MyClass();
c.setMyInt(1232423);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
start a = new start();
a.doIt();
}
}
In MyClass steht:
package myPack;
public class MyClass {
int myInt;
public int getMyInt() {
return myInt;
}
public void setMyInt(int a) {
this.myInt = a;
}
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
System.out.println("Das ist ein Test");
super.finalize();
}
}
So. Beim Durchlauf des Programms wird die Meldung "Das ist ein Test" nicht angezeigt. Warum?
Bei meinem Datenbank-Projekt wird so nämlich die Verbindung zur Datenbank nicht sauber beendet, wenn ich "close" nicht explizit aufrufe (entsprechender Log-Eintrag "LOG: unexpected EOF on client connection" beweist das).
Wenn ich nach a.doIt(); ein System.gc(); mache, dann ist alles in Ordnung.
Kann mir das mal bitte einer erklären?
P.S.: Ja ich weiß das ich darauf achten sollte "close" aufzurufen, aber es geht mir jetzt um's Prinzip. ;)
Danke. :)