2015-08-05 4 views
8

Für mein allererstes Java Projekt versuche ich ein einfaches textbasiertes Spiel zu erstellen. Es scheint, als ob die oder Pipes nicht funktionieren und wenn ich versuche etwas einzugeben, nachdem es nicht funktioniert hat; Ich muss es neu starten.Funktionieren die oder die Rohre nicht?

Start und Anfang funktioniert, aber mit dem ersten Buchstaben Kleinbuchstaben wie ich verwendet || für nicht. Wenn ich diese benutze, muss ich es neu starten, weil ich nichts tippen kann, aber ich habe eindeutig oder Pfeifen, die sagen, eines zu verwenden. Hat jemand eine Idee, was das verursacht?

+7

Was passiert, wenn Sie 'in.nextLine()' aufrufen? – njzk2

+0

'in.nextLine()' wartet wahrscheinlich auf weitere Eingaben. Versuchen Sie, die Eingabe in einer Variablen zu speichern und den Wert davon zu überprüfen. – MikeTheLiar

+0

Als allgemeine Regel habe ich es nützlich gefunden, * Zustandsänderungen niemals "inline" mit anderen Berechnungen/Auswertungen zu machen. (In Ihrem Fall sind die Statusänderungen, wenn Sie Eingaben lesen, die Sie "inline" mit einer booleschen Bedingung machen. Ein anderes Beispiel für das Inkrementieren, zB "i ++".) Ich fand es immer klarer und einfacher, wenn Sie richtig sind halte sie getrennt. Fügen Sie die Statusänderungen vor oder nach anderen Operationen in einer separaten Anweisung ein. Hätten Sie das hier getan, wäre Ihr Problem nie aufgetreten. – jpmc26

Antwort

6
String str = in.nextLine(); 
str.equalsIgnoreCase("Start"); 

Es werden sowohl die unteren als auch die oberen Fälle überprüft. Sie müssen die equals() -Methode nicht zweimal aufrufen, um den Code und die Lesbarkeit zu optimieren.

Ich hoffe, dass dies Ihr Problem lösen wird.

+0

Danke, das hat funktioniert! Obwohl für mich ist es gleich IgnoreCase statt gleich: P – Melon

+0

Danke für die Korrektur mich. Ja, es ist gleich IgnoreCase !! Syntex Fehler: P –

+0

@AnkurMahajan Es ist nicht Syntaxfehler, es wird "kann nicht Symbol finden" Fehler: p –

3

Lagern Sie den Scanner Eingabe in einem String wie folgt aus:

userInput = in.nextLine(); 

Und dann in Ihrem bedingten Anweisungen bewerten

16
in.nextLine().equals("Start") || in.nextLine().equals("start") 

Das von links nach rechts ausgeführt werden, so wird zunächst in.nextLine().equals("Start") ausgeführt.

Nehmen wir an, Sie geben "start" ein. Linke Seite gibt false zurück. Die Bewertung des gesamten Ausdrucks wird fortgesetzt. Die rechte Seite wird ausgeführt, in.nextLine().equals("start"). So liest es eine andere Zeile, wartet auf Ihren anderen Eingang. Das ist nicht was du willst.

Um dies zu beheben (dies ist auch eine allgemeine Regel): nicht den Zustand in der if Zustand ändern. Mit anderen Worten: Ausdruck in der Bedingung sollte keine side effects haben.

Sie können das Ergebnis des Verfahrens zuweisen, der den Zustand ändert, in.nextLine(), auf eine Referenz:

String line = in.nextLine(); 
if (line.equals("Start") || line.equals("start")) 

Sie können auch den Zustand wie schreiben:

if (line.equalsIgnoreCase("start")) 

oder

if (line.toLowerCase().equals("start")) 

Jetzt ist jeder Fall Kombination in Ordnung, auch "START".

Last but not least: diese || werden nicht Pipes genannt. Wenn Sie im Programmierkontext das Wort "pipe" verwenden, denken viele Leute über Unix pipes, | Symbol in der Befehlszeile nach.

In Java || ist "logische oder Operator", "logische oder". Zur Unterscheidung mit "binär oder", |, die sehr unterschiedlich ist.

+3

'str.toLowerCase(). Equals (" etwas ")' sieht immer aus wie die dreckige Schwester von 'str.equalsIgnoreCase (" etwas ")': D. – Tom

+0

Ich stimme zu @Tom: P –

+2

@Tom Zumindest sagen "dreckige kleine * Geschwister *", damit sich jemand beleidigt fühlen kann ... – Durandal

Verwandte Themen