Java Flow Control-Interviewfragen (Antworten)

Fragen im Vorstellungsgespräch zu Java Flow Control (+ Antworten)

1. Einführung

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

In diesem Artikel werden einige Fragen zur Flusskontrolle 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 Anweisungenif-then undif-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 Bedingungtrue ergibt. Die Anweisungif-then-else bietet jedoch einen sekundären Ausführungspfad für den Fall, dass die if-Klauselfalse ergibt:

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

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

Q2. Beschreiben Sie die Anweisungswitch. Welche Objekttypen können in derswitch-Klausel verwendet werden?

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

Jeder Pfad ist mitcase oderdefault gekennzeichnet. Die Anweisungswitch wertet jeden Ausdruck voncasefür eine Übereinstimmung aus und führt alle Anweisungen aus, die der übereinstimmenden Bezeichnung folgen, bis einbreak. s Aussage wurde gefunden. Wenn keine Übereinstimmung gefunden werden kann, wird stattdessen der Blockdefaultausgefü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önnenbyte,short,char,int, ihre verpackten Versionen,enums undStrings alsswitch-Werte verwenden.

Q3. Was passiert, wenn wir vergessen, einebreak-Anweisung in einecase-Klausel vonswitch einzufügen?

Die Aussage vonswitchfällt durch. Dies bedeutet, dass die Ausführung allercase-Beschriftungen fortgesetzt wird, bis einebreak-Anweisung gefunden wird, obwohl diese Beschriftungen 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 enthältnumber den Wert 20 anstelle von 6. Dies kann in Situationen nützlich sein, in denen dieselbe Aktion mit mehreren Fällen verknüpft werden soll.

Q4. Wann ist es vorzuziehen, eineswitch gegenüber einerif-then-else-Anweisung zu verwenden und umgekehrt?

Die Anweisungswitchist besser geeignet, 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;
}

Eineif-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 unddo-while.

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

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

Einewhile-Schleife kann einen Anweisungsblock ausführen, während eine bestimmte Bedingungtrue ist:

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

Ado-while ist eine Variation einerwhile-Anweisung, bei der sich die Auswertung desboolean-Ausdrucks am Ende der Schleife befindet. Dies garantiert, dass der Code mindestens einmal ausgeführt wird:

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

Q6. Was ist eineenhanced for-Schleife?

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

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

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

Mit der Anweisungbreak 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 beschriftetenbreak-Anweisung?

Eine unbeschriftetebreak-Anweisung beendet die innerstenswitch,for,while oderdo-while-Anweisungen, während eine beschriftetebreak die Ausführung einer äußeren Anweisung beendet Erklärung.

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;
        }
    }
}

Wenn die Nummer 37 gefunden wird, beendet die mitbreakbezeichnete Anweisung die äußerstefor-Schleife und es werden keine weiteren Zyklen ausgeführt. Somit endetloopCycles mit dem Wert 5.

Das unbeschriftetebreak beendet jedoch nur die innerste Anweisung und gibt den Kontrollfluss an das äußerstefor zurück, das die Schleife bis zum nächstenrow in der Variablentable fortsetzt DieloopCyclesenden mit einem Wert von 8.

Q9. Was ist der Unterschied zwischen einer unbeschrifteten und einer beschriftetencontinue-Anweisung?

Eine unbeschriftetecontinue-Anweisung springt zum Ende der aktuellen Iteration in der innerstenfor-,while- oderdo-while-Schleife, während eine beschriftetecontinue-Anweisung zu einer überspringt äußere Schlaufe mit dem angegebenen Etikett gekennzeichnet.

Hier ist ein Beispiel, das dies demonstriert:

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;
        }
    }
}

Die Begründung ist die gleiche wie in der vorherigen Frage. Die Anweisungcontinue beendet die äußerstefor-Schleife.

Somit endetloopCycles mit dem Wert 5, während die unbeschriftete Version nur die innerste Anweisung beendet, wodurchloopCycles mit einem Wert von 9 endet.

Q10. Beschreiben des Ausführungsflusses innerhalb einestry-catch-finally-Konstrukts.

Wenn ein Programm den Blocktry eingegeben hat und eine Ausnahme darin ausgelöst wird, wird die Ausführung des Blockstry unterbrochen, und der Steuerungsfluss wird mit einem Blockcatch fortgesetzt, der dies kann Behandeln Sie die ausgelöste Ausnahme.

Wenn kein solcher Block vorhanden ist, wird die aktuelle Methodenausführung gestoppt und die Ausnahme für die vorherige Methode im Aufrufstapel ausgelöst. Wenn keine Ausnahme auftritt, werden alternativ allecatch-Blöcke ignoriert und die Programmausführung wird normal fortgesetzt.

Einfinally-Block wird immer ausgeführt, unabhängig davon, ob eine Ausnahme im Hauptteil destry-Blocks ausgelöst wurde oder nicht.

Q11. In welchen Situationen kann der Blockfinally nicht ausgeführt werden?

Wenn die JVM während der Ausführung der Blöcketry odercatch beendet wird, beispielsweise durch Aufrufen vonSystem.exit(),, oder wenn der ausführende Thread unterbrochen oder beendet wird, wird der Block finally nicht ausgeführt.

Q12. Was ist das Ergebnis der Ausführung des folgenden Codes?

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());

Der Code gibt die Nummer 3 aus. Obwohl der Blockfinallyimmer ausgeführt wird, geschieht dies erst, nachdem der Blocktrybeendet wurde.

Im Beispiel wird die Anweisungreturnausgeführt, bevor der Blocktry-catchendet. Somit hat die Zuordnung zunumber im Blockfinally keine Auswirkung, da die Variable bereits an den aufrufenden Code der MethodetestAssignment zurückgegeben wird.

Q13. In welchen Situationen kann der Blocktry-finallyverwendet werden, auch wenn möglicherweise keine Ausnahmen ausgelöst werden?

Dieser Block ist nützlich, wenn wir sicherstellen möchten, dass die Bereinigung der im Code verwendeten Ressourcen nicht versehentlich umgangen wird, indem eine Anweisungbreak,continue oderreturn angezeigt wird:

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

Außerdem können Situationen auftreten, in denen wir die ausgelöste Ausnahme nicht lokal behandeln können, oder wir möchten, dass die aktuelle Methode die Ausnahme weiterhin auslöst und gleichzeitig Ressourcen freisetzt:

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

Q14. Wie funktionierttry-with-resources?

Die Anweisungtry-with-resourcesdeklariert und initialisiert eine oder mehrere Ressourcen, bevor der Blocktryausgeführt wird, und schließt sie automatisch am Ende der Anweisung, unabhängig davon, ob der Block normal oder abrupt abgeschlossen wurde. Jedes Objekt, das die SchnittstellenAutoCloseable oderCloseable implementiert, kann als Ressource verwendet werden:

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

3. Fazit

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

Viel Glück bei deinem Interview.