Loop, Switch oder Pause? Entscheiden und Iterieren mit Java-Anweisungen

Java-Anwendungen werten Ausdrücke im Kontext von Anweisungen aus , die für Aufgaben wie das Deklarieren einer Variablen, das Treffen einer Entscheidung oder das Durchlaufen von Anweisungen verwendet werden. Eine Aussage kann als einfache oder zusammengesetzte Aussage ausgedrückt werden:

  • Eine einfache Anweisung ist eine einzelne eigenständige Anweisung zum Ausführen einer Aufgabe. Es muss mit einem Semikolon ( ;) abgeschlossen werden.
  • Eine zusammengesetzte Anweisung ist eine Folge von einfachen und anderen zusammengesetzten Anweisungen, die sich zwischen Zeichen in offenen und geschlossenen Klammern ( {und }) befinden und die Grenzen der zusammengesetzten Anweisung begrenzen. Zusammengesetzte Anweisungen können leer sein, erscheinen überall dort, wo einfache Anweisungen erscheinen, und werden alternativ als Blöcke bezeichnet . Eine zusammengesetzte Anweisung wird nicht mit einem Semikolon abgeschlossen.

In diesem Tutorial erfahren Sie, wie Sie Anweisungen in Ihren Java-Programmen verwenden. Sie können Aussagen wie verwenden if, if-else, switch, for, und whilezu erklären , Variablen und geben Sie Ausdrücke, Entscheidungen zu treffen, iterate (oder Schleife) über Aussagen, break und continue Iteration und vieles mehr. Ich werde einige der exotischeren Anweisungen - wie Anweisungen zum Zurückgeben von Werten aus aufgerufenen Methoden und zum Auslösen von Ausnahmen - für zukünftige Java 101-Tutorials belassen.

Wechseln Sie die Ausdrücke in Java 12

Beachten Sie, dass dieses Tutorial für Java 12 aktualisiert wurde und eine kurze Einführung in switchAusdrücke enthält.

download Code abrufen Laden Sie den Quellcode herunter, zum Beispiel Anwendungen in diesem Tutorial. Erstellt von Jeff Friesen für JavaWorld.

Variable Deklarationen und Zuordnungen

Ich habe zuvor Java-Variablen eingeführt und erklärt, dass sie deklariert werden müssen, bevor sie verwendet werden. Da eine Variablendeklaration eine eigenständige Codeinsel ist, handelt es sich effektiv um eine Anweisung - eine einfache Anweisung , um genau zu sein. All dies sind Anweisungen zur Variablendeklaration:

int age = 25; float interest_rate; char[] text = { 'J', 'a', 'v', 'a' }; String name;

Eine Variablendeklaration besteht minimal aus einem Typnamen, optional gefolgt von einer Folge von Paaren mit eckigen Klammern, gefolgt von einem Namen, optional gefolgt von einer Folge von Paaren mit eckigen Klammern und abgeschlossen mit einem Semikolon. Eine Variable kann während ihrer Deklaration auch explizit initialisiert werden.

Betrachten Sie nun die Zuweisungsanweisung , die eng mit der Variablendeklarationsanweisung verwandt ist. Eine Zuweisungsanweisung weist einer Variablen einen Wert (möglicherweise eine Referenz auf ein Array oder eine Referenz auf ein Objekt) zu. Hier sind einige Beispiele:

age = 30; interest_rate = 4.0F; age += 10; text[1] = 'A'; text[2] = 'V'; text[3] = 'A'; name = "John Doe";

Eine Zuweisungsanweisung ist ein Beispiel für eine Ausdrucksanweisung , bei der es sich um einen Ausdruck handelt, der als Anweisung verwendet werden kann, wenn ihm ein Semikolon folgt. Die folgenden Ausdrücke gelten auch als Ausdrucksanweisungen:

  • Vorinkrement (zB ++x;)
  • Vorkrementierung (z. B. --y;)
  • Nachinkrement (zB x++;)
  • Postdecrement (zB y--;)
  • Methodenaufruf (zB System.out.println("Hello");)
  • Objekterstellung (zB new String("ABC");)

Variablendeklarationen mit jshell

Sie können jshelldamit mit Variablendeklarationen und Ausdrucksanweisungen experimentieren. Im Folgenden finden Sie einige Beispiele für den Einstieg (eine Einführung in die Java-Shell finden Sie unter "Java von Grund auf lernen"):

jshell> int age = 25 age ==> 25 jshell> float interest_rate interest_rate ==> 0.0 jshell> char[] text = { 'J', 'a', 'v', 'a' } text ==> char[4] { 'J', 'a', 'v', 'a' } jshell> String name name ==> null jshell> age = 30 age ==> 30 jshell> interest_rate = 4.0F interest_rate ==> 4.0 jshell> age += 10 $7 ==> 40 jshell> text[1] = 'A' $8 ==> 'A' jshell> text[2] = 'V' $9 ==> 'V' jshell> text[3] = 'A' $10 ==> 'A' jshell> name = "John Doe" name ==> "John Doe" jshell> text text ==> char[4] { 'J', 'A', 'V', 'A' } jshell> age++ $13 ==> 40 jshell> age age ==> 41

Beachten Sie, dass age++anscheinend nichts erreicht wurde. Hier sehen Sie, dass dies 40der Arbeitsvariablen zugewiesen wurde $13. Der Nachinkrementierungsoperator führt das Inkrement jedoch nach Rückgabe des aktuellen Werts durch. (Tatsächlich speichert es den aktuellen Wert irgendwo, führt das Inkrement durch und gibt dann den gespeicherten Wert zurück.) Die Eingabe des Alters beweist, dass age41 das Ergebnis der Nachinkrementierungsoperation enthält.

Die Java-Shell bietet verschiedene Befehle und Funktionen, die das Arbeiten mit Snippets vereinfachen. Der /listBefehl zeigt beispielsweise alle Snippets an, die in der aktuellen Sitzung eingegeben wurden:

jshell> /list 1 : int age = 25; 2 : float interest_rate; 3 : char[] text = { 'J', 'a', 'v', 'a' }; 4 : String name; 5 : age = 30 6 : interest_rate = 4.0F 7 : age += 10 8 : text[1] = 'A' 9 : text[2] = 'V' 10 : text[3] = 'A' 11 : name = "John Doe" 12 : text 13 : age++ 14 : age

Die Nummer in der linken Spalte identifiziert ein Snippet eindeutig. Mit dieser Nummer können Sie ein Snippet erneut ausführen, das Snippet auflisten, ein Snippet löschen (löschen) und so weiter:

jshell> /12 text text ==> char[4] { 'J', 'A', 'V', 'A' } jshell> /list 13 13 : age++ jshell> /drop 7 | dropped variable $7 jshell> /list 1 : int age = 25; 2 : float interest_rate; 3 : char[] text = { 'J', 'a', 'v', 'a' }; 4 : String name; 5 : age = 30 6 : interest_rate = 4.0F 8 : text[1] = 'A' 9 : text[2] = 'V' 10 : text[3] = 'A' 11 : name = "John Doe" 12 : text 13 : age++ 14 : age 15 : text

Hier haben wir / 12 eingegeben , um Snippet # 12 erneut auszuführen, das den Inhalt von ausgibt text. Wir haben dann / list 13 eingegeben , um das Snippet # 13 aufzulisten, das inkrementiert wird age. Als nächstes haben wir 7 eingegeben / gelöscht, um Snippet Nr. 7 zu löschen (kein age += 10Snippet mehr ). Schließlich haben wir / list eingegeben , um alle Snippets erneut aufzulisten. Beachten Sie, dass Snippet Nr. 7 entfernt wurde und dank des /12Befehls ein Snippet Nr. 15 hinzugefügt wurde .

Entscheidungen treffen: wenn, wenn-sonst und wechseln

Mit Entscheidungsanweisungen können Anwendungen zwischen mehreren Ausführungspfaden wählen. Wenn ein Verkäufer beispielsweise in diesem Monat mehr als 500 Artikel verkauft, geben Sie dem Verkäufer einen Bonus. Wenn die Note eines Schülers bei einem Algebra-Test mehr als 85 Prozent beträgt, gratulieren Sie dem Schüler zu seiner guten Leistung. Andernfalls empfehlen Sie dem Schüler, für den nächsten Test härter zu lernen.

Java unterstützt if, if-elseund switchEntscheidungs Aussagen. Zusätzlich wurde switchJava 12 eine neue Ausdrucksfunktion hinzugefügt.

Die if-Anweisung

Die einfachste der Java-Entscheidungsanweisungen ist die ifAnweisung, die einen Booleschen Ausdruck auswertet und eine andere Anweisung ausführt, wenn dieser Ausdruck als wahr ausgewertet wird. Die ifAnweisung hat die folgende Syntax:

if (Boolean expression) statement

Die ifAnweisung beginnt mit einem reservierten Wort ifund wird mit einem Booleschen Ausdruck in Klammern fortgesetzt, auf den die Anweisung folgt, die ausgeführt werden soll, wenn der Boolesche Ausdruck den Wert true hat.

Das folgende Beispiel zeigt die ifAussage. Wenn die ageVariable einen Wert von 55 oder höher enthält, wird ifFolgendes ausgeführt System.out.println(...);:

if (age >= 55) System.out.println("You are or were eligible for early retirement.");

Viele Leute ziehen es vor, eine einfache Anweisung, die der ifAnweisung folgt , in geschweifte Klammern zu setzen und sie effektiv in eine äquivalente zusammengesetzte Anweisung umzuwandeln:

if (age >= 55) { System.out.println("You are or were eligible for early retirement."); }

Obwohl die Klammern klarstellen, was von der ifAnweisung ausgeführt wird , glaube ich, dass die Einrückung diese Klarheit bietet und dass die Klammern unnötig sind.

Experimentieren mit if-Anweisungen

Let's try out this example usingjshell. Restart jshell and then introduce an age variable (of type int) that's initialized to 55:

jshell> int age = 55

Next, enter the first example if statement (without the curly braces surrounding its body):

jshell> if (age >= 55) ...> System.out.println("You are or were eligible for early retirement."); You are or were eligible for early retirement. jshell>

Notice that the jshell> prompt changes to the ...> continuation prompt when you enter a multiline snippet. Pressing Enter after the last snippet line causes jshell to immediately execute the snippet.

Execute /list to list all snippets. I observe that the if statement snippet has been assigned 2 in my session. Executing /2 causes jshell to list and then execute this snippet, and the same message is output.

Now, suppose you assign 25 to age and then re-execute /2 (or the equivalent snippet number in your session). This time, you should not observe the message in the output.

The if-else statement

The if-else statement evaluates a Boolean expression and executes a statement. The statement executed depends on whether the expression evaluates to true or false. Here's the syntax for the if-else statement:

if (Boolean expression) statement1 else statement2

The if-else statement is similar to the if statement, but it includes the reserved word else, followed by a statement to execute when the Boolean expression is false.

The following example demonstrates an if-else statement that tells someone who is less than 55 years old how many years are left until early retirement:

if (age >= 55) System.out.println("You are or were eligible for early retirement."); else System.out.println("You have " + (55 - age) + " years to go until early retirement.");

Conditional operator vs if-else

The conditional operator (?:) is similar to an if-else statement. However, this operator cannot be used to execute alternate statements. Instead, it can only return one of two values of the same type. (The conditional operator is also sometimes known as the ternary operator.)

Chaining if-else statements

Java lets you chain multiple if-else statements together for situations where you need to choose one of multiple statements to execute:

if (Boolean expression1) statement1 else if (Boolean expression2) statement2 else ... else statementN

Chaining works by executing a subsequent if-else statement whenever the current if statement's Boolean expression evaluates to false. Consider a demonstration:

if (temperature  100.0) System.out.println("boiling"); else System.out.println("normal");

The first if-else statement determines if temperature's value is negative. If so, it executes System.out.println("freezing");. If not, it executes a second if-else statement.

The second if-else statement determines if temperature's value is greater than 100. If so, it executes System.out.println("boiling");. Otherwise, it executes System.out.println("normal");.

The dangling-else problem

When if and if-else are used together, and the source code isn't properly indented, it can be difficult to determine which if associates with the else. You can see the problem in the code below:

int x = 0; int y = 2; if (x > 0) if (y > 0) System.out.println("x > 0 and y > 0"); else System.out.println("x <= 0");

You would probably expect to see x <= 0 as the output from this code, but it will never happen; instead, nothing will output. The problem is that the else matches up to its nearest if, which is if (y > 0). Reformatting the code makes it clearer what is happening:

int x = 0; int y = 2; if (x > 0) if (y > 0) System.out.println("x > 0 and y > 0"); else System.out.println("x <= 0");

Here it's clearer than an if (y > 0) ... else ...if-else statement follows the if (x > 0) statement. To match the intent of the previous example, you need to introduce brace characters around if (y > 0) and its subsequent statement. Essentially, a block will follow if (x > 0):

int x = 0; int y = 2; if (x > 0) { if (y > 0) System.out.println("x > 0 and y > 0"); } else System.out.println("x <= 0");

Because x > 0 evaluates to false, System.out.println("x <= 0"); executes. The else reserved word clearly matches up to if (x > 0).

The switch statement

When you need to choose between several execution paths, the switch statement offers a more efficient alternative to chaining. Have a look at the switch statement:

switch (selector expression) { case value1: statement1 [break;] case value2: statement2 [break;] ... case valueN: statementN [break;] [default: statement] }

The switch statement begins with reserved word switch and continues with a selector expression that selects one of the subsequent cases or the default case to execute. The selector expression evaluates to an integer, a character, or a string.

Switch and enum constants

The selector expression can also evaluate to an enum constant. I'll introduce enums in a future tutorial.

Jeder Fall identifiziert eine auszuführende Anweisung. Der Fall beginnt mit dem reservierten Wort caseund einem Wert, der den Fall kennzeichnet. Nach einem Doppelpunkt ( :) folgt die auszuführende Anweisung. Auf die Anweisung kann optional gefolgt werden break;, um die Ausführung auf die erste Anweisung danach zu übertragen switch. Wenn keine der Fallbezeichnungen mit dem Wert des Selektorausdrucks übereinstimmt, wird der optionale Standardfall ausgeführt, der mit einem reservierten Wort beginnt default.

Im Folgenden finden Sie eine switchAnweisung, mit der ermittelt wird, ob ein ganzzahliger Wert gerade oder ungerade ist (mithilfe des Restoperators). Es gibt dann eine entsprechende Nachricht über den Fall aus, dessen Bezeichnung mit dem Rest übereinstimmt:

int i = 27; switch (i % 2) { case 0: System.out.println("even"); break; case 1: System.out.println("odd"); }