Java Proramm Neustarten?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Lasse deinen bisherigen Algorithmus innerhalb einer Schleife laufen:

boolean run = true;

while (run) {
  // your code ...
  
  // read input to check if c was pressed ...
  run = input.equals("C");
}

Die Schleife läuft so lange, wie run den Wert true hat. Am Ende der Schleife wird er neu gesetzt, abhängig von der Eingabe des Nutzers.

Im Folgenden noch ein paar Tipps, was du besser machen könntest / solltest:

  • Vergebe eindeutige, aussagekräftige Namen (x sagt z.B. nichts darüber aus, was die Variable beinhaltet bzw. wofür sie überhaupt steht).
  • Halte dich an Java Code-Konventionen. Variablennamen beginnen immer mit einem Kleinbuchstaben. Einzige Ausnahme stellen Konstanten dar.
  • Du erstellst für jeden Fall, bei dem du etwas aus der Konsole lesen möchtest, ein neues Scanner-Objekt. Dabei reicht eines völlig aus. Meide in diesem Zug auch Methodenketten, die lassen sich später nur schlecht prüfen, wenn man bspw. auf Fehlersuche ist. Zudem machen sie den Quellcode schlechter lesbar.
Scanner reader = new Scanner(System.in);
double number = reader.nextDouble();
// etc.
reader.close();
  • Wenn du den Scanner später nicht mehr benötigst, dann schließe ihn. Er hat ja noch eine Verbindung zum Eingabestream offen. Die wird zwar bei Beendigung der Applikation auch automatisch geschlossen, generell ist es aber besserer Stil, explizit auf Ressourcen zu achten, die man nutzt.
  • Binde Packages am Anfang der Datei ein, um deinen Code zu verkürzen:
import java.util.Scanner;

// main:
Scanner scanner = new Scanner(System.in);
  • Folgendes ist doppelter, unnötiger Aufwand:
if (Operator == ('²')) {
  switch (Operator) {

Mit dem if hast du doch bereits bewiesen, dass der Operator den Wert ² hat. Ein switch mit nur einem case lohnt sich des Weiteren nicht.

Vajag 
Fragesteller
 30.08.2018, 19:03

Und kann ich irgendwie die Konsole bei Eclipse leeren also mit einer Funktion oder so. ( Und vielen, vielen Dank für deine Antwort)

LG VaJaG

0
regex9  30.08.2018, 20:06
@Vajag

Rechtsklick in das Konsolenfenster > Clear. Mit Java geht das nicht.

0
Vajag 
Fragesteller
 30.08.2018, 19:16

Und warum geht Folgendes nicht:

Ich bekomme die Fehlermeldung sobald ich meine erste Zahl eingegeben habe:

Exception in thread "main" java.lang...: String index out of range: 0 at... at...

Scanner reader = new Scanner(System.in);

double x = reader.nextDouble();

char Operator = reader.nextLine().charAt(0);
0
regex9  30.08.2018, 20:34
@Vajag

Das Ergebnis von nextLine ist ein leerer String. Der Versuch, auf sein erstes Zeichen zuzugreifen (das ja nicht existiert), schlägt daher fehl.

Die Ursache rührt von Folgendem: Die nextDouble-Methode liest nur die Zahl ein, mehr nicht. Dennoch beendest der Nutzer seine Eingabe ja mit Drücken der Enter-Taste, was das Anlegen einer neuen Zeile bewirkt. Der folgende Aufruf von nextLine findet also schon eine neue Zeile vor, doch die ist leer. Der Nutzer bekommt gar nicht die Gelegenheit, weitere Eingaben zu tätigen, da dies für den Scanner nicht mehr notwendig ist.

Diese Eigenheit wirst du stets reproduzieren können, wenn du die nextLine-Methode nach dem Lesen eines einzelnen Zeichens mit dem Scanner verwendest.

Um das Problem zu lösen, könnte ich dir nun 2 Vorschläge machen:

a) Du rufst nextLine zweimal auf:

Scanner reader = new Scanner(System.in);

double x = reader.nextDouble();
reader.nextLine();
char Operator = reader.nextLine().charAt(0);

b) Du liest stets Eingaben mit nextLine und parst daraus den Wert, den du haben möchtest. Beispiel:

double number = 0;

try {
  number = Double.parseDouble(reader.nextLine());
}
catch (NumberFormatException ex) {
  ex.printStackTrace();
}

Die Methode parseDouble versucht aus der eingegebenen Zeile eine Fließkommazahl herauszulesen. Dies geschieht in einem try-catch-Block. Im try wird Code ausgeführt, von dem man erwartet, dass er möglicherweise einen Ausnahmefall auslöst. Hier rechne ich mit der Ausnahme (Exception), dass die Zeile keine Fließkommazahl enthält. Sollte dem so sein, kann dieser Fall mittels des catch aufgefangen werden. Konkret wartet dieses auf eine NumberFormatException - dieses repräsentiert den geschilderten Ausnahmefall. Im catch lasse ich mir einen Fehler in der Konsole ausgeben, danach kann das Programm relativ stabil weiterlaufen. Würde so ein Ausnahmefall nicht abgefangen werden, könnte das Programm abstürzen.

try-catch gehört noch zu den erweiterten Grundlagenthemen von Java. Du wirst aber eigentlich erst viel später damit konfrontiert. Gleich vorab, um Missbrauch vorzubeugen: Dieses Konstrukt wird nur in bestimmten Situationen eingesetzt, wenn mit einer konkreten, unvermeidbaren Exception bewusst gerechnet werden kann und diese abgefangen werden soll. Dieses Konstrukt ist kein Allheilmittel um jeglichen Code hineinzuklatschen.

0

Per main(null) kannst du es effektiv neu starten. Das ist nicht die beste Lösung, aber eine Lösung.

Vajag 
Fragesteller
 30.08.2018, 18:16

Hey,

wie und wo bringe ich das in den Code ein.

LG VaJaG

0
PerfectMuffin  30.08.2018, 18:18
@Vajag

Du hast doch im Code bereits demonstriert, dass du auf Eingaben reagieren kannst?

Nimm if oder meinetwegen Switch-case.

Besser wäre natürlich eine Schleife.

0
Vajag 
Fragesteller
 30.08.2018, 18:23
@PerfectMuffin

Unter die letzte Zeile Code dann so was wie:

If (Restart == "C")

main(null)

Oder was sorry ich blick gerade net durch

0
PerfectMuffin  30.08.2018, 19:35
@Vajag

So ungefähr, aber du kannst Strings nicht mit == vergleichen, wenn sie zur Laufzeit generiert werden.

0