Fragen zum Java Flow Control-Interview (+ Antworten)

Dieser Artikel ist Teil einer Reihe: • Fragen zum Interview mit Java Collections

• Fragen zum Java Type System-Interview

• Fragen zum Java Concurrency-Interview (+ Antworten)

• Fragen zum Java-Klassenstruktur- und Initialisierungsinterview

• Fragen zum Java 8-Interview (+ Antworten)

• Speicherverwaltung in Java Interview Fragen (+ Antworten)

• Fragen zum Java Generics-Interview (+ Antworten)

• Fragen zum Java Flow Control-Interview (+ Antworten) (aktueller Artikel) • Fragen zum Interview mit Java-Ausnahmen (+ Antworten)

• Fragen zum Interview mit Java Annotations (+ Antworten)

• Fragen zum Top Spring Framework-Interview

1. Einleitung

Mithilfe von Kontrollflussanweisungen können Entwickler mithilfe von Entscheidungsfindung, Schleifen und Verzweigungen den Ausführungsfluss bestimmter Codeblöcke bedingt ändern.

In diesem Artikel werden einige Fragen zu Flusskontrollinterviews behandelt, die möglicherweise während eines Interviews auftauchen. Wir werden Beispiele implementieren, um ihre Antworten besser zu verstehen.

2. Fragen

Q1. Beschreiben Sie die Anweisungen if-then und if-then-else . Welche Arten von Ausdrücken können als Bedingungen verwendet werden?

Beide Anweisungen weisen unser Programm an, den darin enthaltenen Code nur auszuführen, wenn eine bestimmte Bedingung als wahr ausgewertet wird . Die if-then-else- Anweisung bietet jedoch einen sekundären Ausführungspfad für den Fall, dass die if-Klausel den Wert false hat :

if (age >= 21) { // ... } else { // ... }

Im Gegensatz zu anderen Programmiersprachen unterstützt Java nur boolesche Ausdrücke als Bedingungen. Wenn wir versuchen, einen anderen Ausdruckstyp zu verwenden, wird ein Kompilierungsfehler angezeigt.

Q2. Beschreiben Sie die switch- Anweisung. Welche Objekttypen können in der switch- Klausel verwendet werden?

Switch ermöglicht die Auswahl mehrerer Ausführungspfade basierend auf dem Wert einer Variablen.

Jeder Pfad ist mit case oder default gekennzeichnet . Die switch- Anweisung wertet jeden case- Ausdruck für eine Übereinstimmung aus und führt alle Anweisungen aus, die der übereinstimmenden Bezeichnung folgen, bis eine break- Anweisung gefunden wird. Wenn keine Übereinstimmung gefunden werden kann, wird stattdessen der Standardblock ausgeführt:

switch (yearsOfJavaExperience) { case 0: System.out.println("Student"); break; case 1: System.out.println("Junior"); break; case 2: System.out.println("Middle"); break; default: System.out.println("Senior"); }

Wir können Byte , Short , Char , Int , ihre umschlossenen Versionen, Enums und Strings als Schalterwerte verwenden.

Q3. Was passiert, wenn wir vergessen, eine break- Anweisung in eine case- Klausel eines Switches einzufügen ?

Die switch- Anweisung fällt durch. Dies bedeutet, dass die Ausführung aller Fallbezeichnungen fortgesetzt wird , bis eine break- Anweisung gefunden wird, obwohl diese Bezeichnungen nicht mit dem Wert des Ausdrucks übereinstimmen.

Hier ist ein Beispiel, um dies zu demonstrieren:

int operation = 2; int number = 10; switch (operation) { case 1: number = number + 10; break; case 2: number = number - 4; case 3: number = number / 3; case 4: number = number * 10; break; }

Nach dem Ausführen des Codes hat number den Wert 20 anstelle von 6. Dies kann in Situationen hilfreich sein, in denen dieselbe Aktion mehreren Fällen zugeordnet werden soll.

Q4. Wann ist es vorzuziehen, eine Hexe gegenüber einer I f-Then-Else- Aussage zu verwenden und umgekehrt?

Eine switch- Anweisung eignet sich besser, wenn eine einzelne Variable gegen viele einzelne Werte getestet wird oder wenn mehrere Werte denselben Code ausführen:

switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; break; case 2: days = 28; break; default: days = 30; }

Eine if-then-else- Anweisung ist vorzuziehen, wenn Wertebereiche oder mehrere Bedingungen überprüft werden müssen:

if (aPassword == null || aPassword.isEmpty()) { // empty password } else if (aPassword.length() < 8 || aPassword.equals("12345678")) { // weak password } else { // good password }

Q5. Welche Arten von Schleifen unterstützt Java?

Java bietet drei verschiedene Arten von Schleifen: for , while und do-while .

Eine for- Schleife bietet eine Möglichkeit, über einen Wertebereich zu iterieren. Es ist am nützlichsten, wenn wir im Voraus wissen, wie oft eine Aufgabe wiederholt wird:

for (int i = 0; i < 10; i++) { // ... }

A während Schleife kann einen Block von Anweisungen auszuführen , während eine bestimmte Bedingung ist wahr :

while (iterator.hasNext()) { // ... }

Ein do-while ist eine Variation einer while- Anweisung, bei der sich die Auswertung des booleschen Ausdrucks am Ende der Schleife befindet. Dies garantiert, dass der Code mindestens einmal ausgeführt wird:

do { // ... } while (choice != -1);

Q6. Was ist eine erweiterte for- Schleife?

Ist eine andere Syntax der for- Anweisung, die alle Elemente einer Sammlung, eines Arrays, einer Aufzählung oder eines Objekts durchlaufen soll, das die Iterable- Schnittstelle implementiert :

for (String aString : arrayOfStrings) { // ... }

Q7. Wie können Sie eine Schleife vorzeitig verlassen?

Mit der break- Anweisung können wir die Ausführung einer Schleife sofort beenden:

for (int i = 0; ; i++) { if (i > 10) { break; } }

Q8. Was ist der Unterschied zwischen einer unbeschrifteten und einer beschrifteten break- Anweisung?

Eine unmarkierte Pause - Anweisung beendet die innerste Schalter , für , während oder do-while - Anweisung, während eines markierten Pause beendet die Ausführung einer äußeren Aussage.

Erstellen wir ein Beispiel, um dies zu demonstrieren:

int[][] table = { { 1, 2, 3 }, { 25, 37, 49 }, { 55, 68, 93 } }; boolean found = false; int loopCycles = 0; outer: for (int[] rows : table) { for (int row : rows) { loopCycles++; if (row == 37) { found = true; break outer; } } }

When the number 37 is found, the labeled break statement terminates the outermost for loop, and no more cycles are executed. Thus, loopCycles ends with the value of 5.

However, the unlabeled break only ends the innermost statement, returning the flow of control to the outermost for that continues the loop to the next row in the table variable, making the loopCycles end with a value of 8.

Q9. What is the difference between an unlabeled and a labeled continue statement?

An unlabeled continue statement skips to the end of the current iteration in the innermost for, while, or do-while loop, whereas a labeled continue skips to an outer loop marked with the given label.

Here's an example that demonstrates this:

int[][] table = { { 1, 15, 3 }, { 25, 15, 49 }, { 15, 68, 93 } }; int loopCycles = 0; outer: for (int[] rows : table) { for (int row : rows) { loopCycles++; if (row == 15) { continue outer; } } }

The reasoning is the same as in the previous question. The labeled continue statement terminates the outermost for loop.

Thus, loopCycles ends holding the value 5, whereas the unlabeled version only terminates the innermost statement, making the loopCycles end with a value of 9.

Q10. Describe the execution flow inside a try-catch-finally construct.

When a program has entered the try block, and an exception is thrown inside it, the execution of the try block is interrupted, and the flow of control continues with a catch block that can handle the exception being thrown.

If no such block exists then the current method execution stops, and the exception is thrown to the previous method on the call stack. Alternatively, if no exception occurs, all catch blocks are ignored, and program execution continues normally.

A finally block is always executed whether an exception was thrown or not inside the body of the try block.

Q11. In which situations the finally block may not be executed?

When the JVM is terminated while executing the try or catch blocks, for instance, by calling System.exit(), or when the executing thread is interrupted or killed, then the finally block is not executed.

Q12. What is the result of executing the following code?

public static int assignment() { int number = 1; try { number = 3; if (true) { throw new Exception("Test Exception"); } number = 2; } catch (Exception ex) { return number; } finally { number = 4; } return number; } System.out.println(assignment());

The code outputs the number 3. Even though the finally block is always executed, this happens only after the try block exits.

In the example, the return statement is executed before the try-catch block ends. Thus, the assignment to number in the finally block makes no effect, since the variable is already returned to the calling code of the assignment method.

Q13. In which situations try-finally block might be used even when exceptions might not be thrown?

This block is useful when we want to ensure we don't accidentally bypass the clean up of resources used in the code by encountering a break, continue or return statement:

HeavyProcess heavyProcess = new HeavyProcess(); try { // ... return heavyProcess.heavyTask(); } finally { heavyProcess.doCleanUp(); }

Also, we may face situations in which we can't locally handle the exception being thrown, or we want the current method to throw the exception still while allowing us to free up resources:

public void doDangerousTask(Task task) throws ComplicatedException { try { // ... task.gatherResources(); if (task.isComplicated()) { throw new ComplicatedException("Too difficult"); } // ... } finally { task.freeResources(); } }

Q14. How does try-with-resources work?

The try-with-resources statement declares and initializes one or more resources before executing the try block and closes them automatically at the end of the statement regardless of whether the block completed normally or abruptly. Any object implementing AutoCloseable or Closeable interfaces can be used as a resource:

try (StringWriter writer = new StringWriter()) { writer.write("Hello world!"); }

3. Conclusion

In diesem Artikel haben wir einige der am häufigsten gestellten Fragen behandelt, die in technischen Interviews für Java-Entwickler zu Kontrollflussanweisungen gestellt wurden. Dies sollte nur als Beginn weiterer Forschung und nicht als vollständige Liste betrachtet werden.

Viel Glück in Ihrem Interview.

Weiter » Fragen zum Interview mit Java-Ausnahmen (+ Antworten) « Vorherige Fragen zum Java Generics-Interview (+ Antworten)