# System.exit(0) oder was?



## Souljacker (30. Nov 2008)

Hi!

Vor kurzem hat unser Prof in der Vorlesung am 
	
	
	
	





```
System.exit(0);
```
 gemosert. Da wird ja die VM beendet und das kann bei bestimmten Anwendungen (z. B. Webserver) problematisch sein. Aber entweder hat der Prof keine Alternative vorgestellt, oder ich hab grad geschlafen   .

Gibts da Alternativen? Wenn ja, welche?


----------



## Marco13 (30. Nov 2008)

Ein Programm sollte i.a. auf einem "vorgegebenen" Weg zu einem Ende kommen. Ein "Hello World" enthält ja auch kein System.exit: Nach der main ist das Programm zuende....


----------



## moormaster (30. Nov 2008)

Ja, einfach alle aktiven Threads (inkl. dem, der die main() Methode ausführt) zu ende laufen lassen, dann beendet sich auch die VM.

Das heisst also, du musst nur die main-Funktion verlassen und alle Threads, die du selber angelegt hast, zum Ende bringen. Wenn deine Anwendung eine grafische Benutzeroberfläche hat, dann wird dort auch ein mindestens ein Thread angelegt. Diese GUI-Threads sollten sich beenden, sobald alle Frames / JFrames mit einem dispose()-Aufruf vernichtet wurden.


----------



## Souljacker (30. Nov 2008)

Okay klingt einleuchtend, aber wenn ich jetzt z. B. eine switch-Anweisung zur Programmsteuerung benutze...also wenn ich in die Konsole "quit" eintippe, wie soll ich das Programm dann beenden?


----------



## SlaterB (30. Nov 2008)

eine solche Steuerung verwendet doch eine Schleife,
bei quit die Schleife verlassen/ die aktuelle Methode mit return; verlassen oder so


----------



## Souljacker (30. Nov 2008)

Hmmm, eine switch-Anweisung ist doch eigentlich ein Spezialfall der if-Anweisung, also eigentlich eine Fallunterscheidung. Also ich meine ich möchte das Programm mittels Eingabe von "quit" komplett beenden/verlassen. Geht das überhaupt ohne das 
	
	
	
	





```
System.exit(0)
```
-Statement?

Also nicht aus einer Methode raus...oder versteh ich dich falsch SlaterB?

Ich hab in meinem Skript nachgesehen und da wird diese Art der Programm-Beendung als unsicher bezeichnet. Ich 
nehme an, es könnte damit eben Schabernack getrieben werden...z.B. den oben genannten Webserver komplett beenden oder so... :idea:


----------



## maki (30. Nov 2008)

>> Geht das überhaupt ohne das ....

Wurde doch jetzt schon mehrfach erklärt.

Zeig mal deinen Code.


----------



## Der Müde Joe (30. Nov 2008)

Souljacker hat gesagt.:
			
		

> Also ich meine ich möchte das Programm mittels Eingabe von "quit" komplett beenden/verlassen. Geht das überhaupt ohne das




```
import java.util.Scanner;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		String next;
		while ((next = scanner.next()) != null) {
			if ("quit".equals(next)) {
				break; //naja...nicht grad schön...aber ok
			} else {
				System.out.println("hallo " + next);
			}
		}
		System.out.println("bye bye...");
	}
}
```

klar. Wenn alle Threads welche nicht deamons sind beendet sind, ist das Progamme fertig.


----------



## SlaterB (30. Nov 2008)

zum switch alleine kann man wenig sagen, wichtig ist, wo es steht, wer es wann wie aufruft

ich dachte an:

[code-Block den Der Müde Joe jetzt schon besser geschrieben hat  ]



wenn dein Programm anders aussieht, dann musst du das schon näher erklären,
überall gibts einen bestimmten Weg,

ganz falsch kann 
System.exit(0);
übrigens nicht sein, schließlich gibt es JFrame.EXIT_ON_CLOSE,
welches das auch letztlich aufruft,

aber dispose() soll bei graphischen Oberflächen auch gehen, das wäre dann wohl wieder die saubere Variante


----------



## Souljacker (30. Nov 2008)

Also eine graphische Oberfläche hab ich jetzt nicht...

Hier mein Code für meine main-methode:

```
public static void main(String[] args) throws IOException {
        
        BufferedReader input = new BufferedReader(new InputStreamReader(
                System.in));

        PlayingField game = new PlayingField();
        
        boolean quit = false;

        while (!quit) {
            System.out.print(PROMPT);
            String currLine = input.readLine();
            StringTokenizer inStream = new StringTokenizer(currLine);
            
            // For empty input
            if (input == null) {
                break;
            }

            if (inStream.hasMoreTokens()) {
                String command = inStream.nextToken();

                switch (command.toUpperCase().charAt(0)) {
                case 'H':
                    // Displays command overview
                    helpMessage commands = new helpMessage();
                    commands.help();
                    break;
                case 'Q':
                    // Quits the programm
                    System.exit(0);
                default:
                    System.out.println("Error! Unknown command!"
                            + " Type <h> for help!");
                    break;
                }
            }
        }
    }
```

Die anderen case-Fälle hab ich jetzt mal rausgenommen, nicht das ich noch Probleme in der Uni krieg, wenn hier einer drüber stolpert...

Ja das System.exit(0) nicht ganz falsch sein kann dachte ich mir, weil ichs bis jetzt eigentlich immer so gemacht hab...und keiner hat sich beschwert!  :lol:


----------



## Der Müde Joe (30. Nov 2008)

```
case 'Q':
	// Quits the programm
	quit = true;
	break;
```


----------



## Souljacker (30. Nov 2008)

Hmmmm, aaaaaahhhhh, hab vor lauter Bäumen den Wald nicht mehr gesehen...DANKE!  :applaus:


----------



## Der Müde Joe (30. Nov 2008)

by the way:

StringTokenizer sollte man nicht mehr benutzen.


```
while (!quit) {
	String currLine = input.readLine();
	// For empty input
	if (input == null) {
		break;
	}
	char[] cs = currLine.toUpperCase().toCharArray();
	
	for(char c : cs) {
		switch (c) {
		//...
		}
	}
}
```

EDIT: sehe grad ist gar nicht dasselbe...

also gleich so

```
while (!quit) {
	String currLine = input.readLine();
	// For empty input
	if (input == null) {
		break;
	}
	switch (currLine.toUpperCase().charAt(0)) {
	// ...
	}
}
```


----------



## Souljacker (3. Dez 2008)

THX a lot...!  :applaus:


----------



## maki (3. Dez 2008)

> by the way:
> 
> StringTokenizer sollte man nicht mehr benutzen.


Warum eigentlich?


----------



## Souljacker (3. Dez 2008)

Kommt glaub ich von Sun.

Ich hab in der API folgendes gefunden:



> StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split  method of String or the java.util.regex package instead.


----------



## maki (3. Dez 2008)

Danke


----------

