Studium, Ausbildung und Beruf
 StudiumHome   FAQFAQ   RegelnRegeln   SuchenSuchen    RegistrierenRegistrieren   LoginLogin

Programm "sauber" beenden
Gehe zu Seite 1, 2  Weiter
Neues Thema eröffnen   Neue Antwort erstellen
Foren-Übersicht -> Informatik-Forum -> Programm "sauber" beenden
 
Autor Nachricht
PriinCe
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 10.02.2010
Beiträge: 40

BeitragVerfasst am: 17 Apr 2010 - 09:15:59    Titel: Programm "sauber" beenden

Guten Tag,
ich habe ein Problem. Mein Lehrer ist gerade mit dem Thema Netzwerkprogrammierung angefangen. Und wir haben uns folgendes Tutorial von Java angeschaut:

http://java.sun.com/docs/books/tutorial/networking/sockets/readingWriting.html

Wenn ihr da auf weiter klickt, findet ihr noch eine wietere Klasse.

Wir haben uns dieses genau angesehen und sollen dieses in einen "guten" Programmierstile umbauen.

Soweit ist auch noch alles okay (Neue Methode anlegen Exceptions abfangen etc....). Nur jetzt meint mein Lehrer zu mir "Das System.exit(1) ist eine unschöne Methode das Programm zu beenden. Da hier noch die Objekte im Speicher bleiben oder so, hab ich nicht richtig verstanden =(.
Nun habe ich eine Methode gebaut, welche die Datenfelder (Die gesamten Reader und Writer und den Socket auf "null" setzt, also hab ich doch alle Objekte zerstört (wegen Garbagecollector) oder? Nur dadurch ist ja mein Programm noch nicht gestoppt. Weil es läuft ja wieter. Nun meine Frage, wie stoppe ist das Programm "sauber"?

Danke für die Hilfe (=
sarc
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 21.09.2006
Beiträge: 2657

BeitragVerfasst am: 17 Apr 2010 - 13:23:38    Titel:

Ähm? Frag da bitte noch mal nach, was der damit genau gemeint hat. Du kannst natürlich statt System.exit() aufzurufen ne Exception schmeißen, die dich zur main zurückwirft. Aber eigentlich ist System.exit() schon n vernünftiger Weg, sein Programm zu beenden. Der Garbage Collector kümmert sich auch dann um alle Objekte, die da sind. Auch alle Threads werden automatisch beendet, wenn das Programm abgewürgt wird (außer man gibt explizit was anderes vor).

Was sein könnte ist, dass bei schlechten Klassen noch Ressourcen geöffnet sind (Sockets, Dateien, ...), die man vorher schließen sollte. Bei guten Klassen stehen solche Sachen aber im Destruktor drin, so dass das automatisch erledigt wird, wenn sich der Garbage Collector der Sache annimmt. Wobei es hier natürlich nicht verkehrt wäre, das vorher von Hand zu machen, weil der GC nicht sofort alles abarbeitet.

Man kann drüber streiten, ob der Aufruf von System.exit() guter Programmierstil ist. Denn das ganz klare Problem ist, dass dann das Programm an irgendwelchen Stellen abgewürgt werden kann. Da wäre es schon schöner, mit Exceptions zu arbeiten, und die Entscheidung, ob das Programm beendet werden soll oder nicht, nur in einer Klasse zu treffen. Aber die Begründung, die du da angegeben hast, finde ich etwas seltsam.
PriinCe
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 10.02.2010
Beiträge: 40

BeitragVerfasst am: 17 Apr 2010 - 14:03:08    Titel:

Danke für die Antwort (=

Also ich kann euch nur die Begründung erzählen, die mein Info Lehrer mir gesagt hat. Und dann hab ich mich jetzt schon 2 - 3 Stundne damit beschäftigt und einfach keinen anderen Weg gefunden, mein Programm zu beenden.

In meinem Netzwerkprogramm habe ich extra eine Methode geschreiben, die alle Sockets etc. schließt (also die Methode .close()) und halt die Methode, welche das Programm beendet (System.exit(0)).

Also ich werde meinen Lehrer nochmal drauf ansprechen und ihn fragen, was er als bessere Lösung empfindet.

Falls Interesse besteht, kann ich seine Antwort ja mal hier schrieben Wink
IjonTichy
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 06.06.2009
Beiträge: 86

BeitragVerfasst am: 17 Apr 2010 - 18:11:33    Titel:

@sarc:
"...Bei guten Klassen stehen solche Sachen aber im Destruktor drin, so dass das automatisch erledigt wird..."

Sorry dem kann ich nicht zustimmen. In Java, anders als in C++, wird der Aufruf des Destructors(finalize) NICHT garantiert, weil der Aufruf des Garbage-Collector ebensowenig garantiert ist. In diesem Sinn ist ein wenig Sorgfalt beim Aufräumen von Resourcen durchaus erforderlich.
PriinCe
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 10.02.2010
Beiträge: 40

BeitragVerfasst am: 17 Apr 2010 - 18:55:12    Titel:

Du sagst, es ist ein wenig Sorgfalt geboten. Nur ich stelle mir die Fragen, wie ich Sorgfalt verstehen soll. Soll ich allso alle Datenfelder auf "null" setzen und bei z.B. Sockets immer .close() aufrufen, oder wie meinst du das genau? Embarassed

Danke für die Erklärung (=
IjonTichy
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 06.06.2009
Beiträge: 86

BeitragVerfasst am: 17 Apr 2010 - 19:14:59    Titel:

Das siehst du ganz richtig. Ganz allgemein gehalten, solltest du alle Resourcen freigeben wenn du sie nicht mehr benötigst. Wie dies für die verschiedenen Typen von Resourcen aussieht solltest du in den zugehörigen Dokumentationen finden.
PriinCe
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 10.02.2010
Beiträge: 40

BeitragVerfasst am: 17 Apr 2010 - 21:50:46    Titel:

Gut (=,
Nur dann stelle ich mir noch eine Frage.
Ich muss das Programm dann doch später trotzdem mit Stystem.exit() beenden, da sonnst der Thread in der Virtuelle Java Maschine ja nicht stoppt oder?
Weil sonnst läuft ja der Thread weiter und lastet meinen Computer aus oder?
sarc
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 21.09.2006
Beiträge: 2657

BeitragVerfasst am: 17 Apr 2010 - 22:39:31    Titel:

Ok... Ich dachte bis jetzt, dass zwar nicht garantiert ist, wann der Destruktor aufgerufen wird, dass es aber irgendwann auf jeden Fall passieren wird. Selbst wenn das Programm mit System.exit() abgewürgt wird. Na ja, man sollt man die Doku lesen, da steht eigentlich drin, dass genau das standardmäßig nicht passiert... Dann nehm ich alles zurück. Smile
IjonTichy
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 06.06.2009
Beiträge: 86

BeitragVerfasst am: 18 Apr 2010 - 05:11:45    Titel:

Du solltest das Programm "regulär" beenden. Da ich nicht weiß wie dein Programm aussieht kann ich dir nicht sagen wie das bei dir am Besten zu arrangieren ist. Normalerweise läuft eine Server-Anwendung, wie von dir geschildert, in einer Endlosschleife, die man, beispielsweise, mit einer vorgegebenen Tastenkombination beendet. System.exit ist halt die Holzhammer-Methode.
PriinCe
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 10.02.2010
Beiträge: 40

BeitragVerfasst am: 18 Apr 2010 - 09:14:44    Titel:

Und was ist mit der Methode eine Exception zu werfen, welche ich in der main() auffange und dadurch das Programm immer bei der Exception ans Ende der main() springt und dadurch mein Programm beendet ist?
Beiträge der letzten Zeit anzeigen:   
Foren-Übersicht -> Informatik-Forum -> Programm "sauber" beenden
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

Chat :: Nachrichten:: Lexikon :: Bücher :: Impressum