Dotazy týkajúce sa riadenia toku Java (+ odpovede)

Tento článok je súčasťou série: • Otázky týkajúce sa rozhovorov o zbierkach Java

• Dotazy týkajúce sa systému typu Java

• Otázky týkajúce sa rozhovorov o súbehu Java (+ odpovede)

• Otázky týkajúce sa štruktúry triedy Java a inicializácie

• Otázky týkajúce sa rozhovoru s Java 8 (+ odpovede)

• Správa pamäte v otázkach týkajúcich sa rozhovorov Java (+ odpovede)

• Java Generics Interview otázky (+ odpovede)

• Otázky týkajúce sa rozhovoru o riadení toku Java (+ odpovede) (aktuálny článok) • Otázky rozhovoru týkajúce sa výnimiek Java (+ odpovede)

• Dotazy k anotáciám Java (+ odpovede)

• Najlepšie otázky týkajúce sa jarného rámcového rozhovoru

1. Úvod

Príkazy riadiacich tokov umožňujú vývojárom pomocou rozhodovania, cyklovania a rozvetvenia podmienene zmeniť tok vykonávania konkrétnych blokov kódu.

V tomto článku si prejdeme niekoľko otázok týkajúcich sa rozhovoru s kontrolou toku, ktoré sa môžu počas pohovoru objaviť, a prípadne; implementujeme príklady, aby sme lepšie pochopili ich odpovede.

2. Otázky

Q1. Popíšte Ak potom a ak-potom-ešte Vyhlásenia. Aké typy výrazov možno použiť ako podmienky?

Oba výroky hovoria nášmu programu, aby vykonal kód v nich, iba ak sa konkrétna podmienka vyhodnotí ako pravda. Avšak ak-potom-ešte príkaz poskytuje sekundárnu cestu vykonania v prípade, že klauzula if je vyhodnotená na nepravdivé:

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

Na rozdiel od iných programovacích jazykov Java podporuje iba boolovský výrazy ako podmienky. Ak sa pokúsime použiť iný typ výrazu, zobrazí sa chyba kompilácie.

Q2. Popíšte prepínač vyhlásenie. Aké typy objektov je možné použiť v prepínač doložka?

Prepínač umožňuje výber niekoľkých ciest vykonávania na základe hodnoty premenných.

Každá cesta je označená prípade alebo predvolené, prepínač vyhlásenie hodnotí každý prípade výraz pre zhodu a vykoná všetky príkazy, ktoré nasledujú za zhodným štítkom, až a prestávka vyhlásenie sa našlo. Ak nenájde zhodu, predvolené namiesto toho sa vykoná blok:

switch (yearsOfJavaExperience) {case 0: System.out.println ("Student"); prestávka; prípad 1: System.out.println ("Junior"); prestávka; prípad 2: System.out.println ("Stredný"); prestávka; predvolené: System.out.println ("Senior"); }

Môžeme použiť bajt, krátky, char, int, ich zabalené verzie, enums a Strings ako prepínač hodnoty.

Q3. Čo sa stane, keď zabudneme vložiť a prestávka vyhlásenie v a prípade doložka a prepínač?

The prepínač vyhlásenie padá-koryto. To znamená, že bude pokračovať vo vykonávaní všetkých prípade štítky, pokiaľ nenájde a prestávka napriek tomu, že tieto označenia nezodpovedajú hodnote výrazu.

Tu je príklad, ktorý to demonštruje:

int prevádzka = 2; int cislo = 10; switch (operation) {case 1: number = number + 10; prestávka; prípad 2: číslo = číslo - 4; prípad 3: číslo = číslo / 3; prípad 4: number = number * 10; prestávka; }

Po spustení kódu číslo má hodnotu 20 namiesto 6. To môže byť užitočné v situáciách, keď chceme priradiť rovnakú akciu k viacerým prípadom.

Q4. Kedy je lepšie použiť S.čarodejnica Cez jaf-Potom-Inak Vyhlásenie a naopak?

A prepínač vyhlásenie je vhodnejšie pri testovaní jednej premennej proti mnohým jednotlivým hodnotám alebo pri použití viacerých hodnôt s rovnakým kódom:

switch (month) {case 1: case 3: case 5: case 7: case 8: case 10: case 12: days = 31; prestávka; prípad 2: dni = 28; prestávka; predvolené: dni = 30; }

An ak-potom-ešte vyhlásenie je vhodnejšie, keď potrebujeme skontrolovať rozsahy hodnôt alebo viac podmienok:

if (aPassword == null || aPassword.isEmpty ()) {// prázdne heslo} else if (aPassword.length () <8 || aPassword.equals ("12345678")) {// slabé heslo} else {/ / dobré heslo}

Q5. Aké typy slučiek podporuje Java?

Java ponúka tri rôzne typy slučiek: pre, zatiaľ čoa do-zatiaľ.

A pre slučka poskytuje spôsob iterácie v rozsahu hodnôt. Je to najužitočnejšie, keď vopred vieme, koľkokrát sa bude úloha opakovať:

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

A zatiaľ čo slučka môže vykonať blok príkazov, kým je konkrétna podmienka pravda:

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

A do-zatiaľ je variácia a zatiaľ čo vyhlásenie, v ktorom je hodnotenie boolovský výraz je v spodnej časti slučky. To zaručuje, že sa kód spustí aspoň raz:

do {// ...} while (výber! = -1);

Q6. Čo je to vylepšené pre slučka?

Je ďalšou syntaxou súboru pre vyhlásenie určené na iteráciu cez všetky prvky kolekcie, poľa, výčtu alebo ľubovoľného objektu implementujúceho Iterable rozhranie:

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

Q7. Ako môžete predvídať výstup zo slučky?

Pomocou prestávka môžeme okamžite ukončiť vykonávanie cyklu:

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

Q8. Aký je rozdiel medzi neoznačeným a označeným prestávka vyhlásenie?

Bez označenia prestávka výrok ukončuje najvnútornejšie prepínač, pre, zatiaľ čo alebo do-zatiaľ vyhlásenie, zatiaľ čo označené prestávka končí vykonanie vonkajšieho vyhlásenia.

Vytvorme príklad, ktorý to demonštruje:

int [] [] tabuľka = {{1, 2, 3}, {25, 37, 49}, {55, 68, 93}}; boolean found = false; int loopCycles = 0; vonkajšie: pre (int [] riadky: tabuľka) {for (int riadok: riadky) {loopCycles ++; if (riadok == 37) {found = true; zlomiť vonkajší; }}}

Keď sa nájde číslo 37, označené prestávka vyhlásenie končí najvzdialenejšie pre slučka a už sa nevykonávajú žiadne cykly. Teda loopCycles končí hodnotou 5.

Avšak bez označenia prestávka iba končí najhlbšie vyjadrenie a vracia tok kontroly k najvzdialenejším pre ktorá pokračuje v slučke do ďalšej riadok v stôl premenná, čím sa loopCycles končiť s hodnotou 8.

Q9. Aký je rozdiel medzi neoznačeným a označeným ďalej vyhlásenie?

Bez označenia ďalej vyhlásenie preskočí na koniec aktuálnej iterácie vo vnútri pre, zatiaľ čoalebo do-zatiaľ slučka, zatiaľ čo označená ďalej preskočí na vonkajšiu slučku označenú daným štítkom.

Tu je príklad, ktorý to demonštruje:

int [] [] tabuľka = {{1, 15, 3}, {25, 15, 49}, {15, 68, 93}}; int loopCycles = 0; vonkajšie: pre (int [] riadky: tabuľka) {for (int riadok: riadky) {loopCycles ++; if (riadok == 15) {pokračovať vonkajší; }}}

Odôvodnenie je rovnaké ako v predchádzajúcej otázke. Označené ďalej vyhlásenie končí najvzdialenejšie pre slučka.

Teda loopCycles končí držaním hodnoty 5, zatiaľ čo neoznačená verzia končí iba s najhlbším výrokom, čím loopCycles končiť s hodnotou 9.

Q10. Popíšte priebeh vykonávania vo vnútri a skús chytiť-konečne konštrukt.

Keď program vstúpi do skús bloku a do jeho vnútra je hodená výnimka, vykonanie skús blok je prerušený a tok riadenia pokračuje a chytiť blok, ktorý zvládne vyvolanie výnimky.

Ak taký blok neexistuje, súčasné vykonávanie metódy sa zastaví a výnimka sa vyvolá na predchádzajúcu metódu v zásobníku hovorov. Prípadne, ak sa nevyskytne žiadna výnimka, všetky chytiť bloky sú ignorované a vykonávanie programu pokračuje normálne.

A konečne blok sa vždy vykoná bez ohľadu na to, či bola v tele súboru vyvolaná výnimka alebo nie skús blokovať.

Q11. V ktorých situáciách konečne blok nemusí byť vykonaný?

Keď je JVM ukončený pri vykonávaní skús alebo chytiť blokuje napríklad volaním System.exit (), alebo keď je vykonávajúce vlákno prerušené alebo zabité, potom sa konečne blok nevykoná.

Q12. Aký je výsledok vykonania nasledujúceho kódu?

verejné statické priradenie int () {int číslo = 1; skúsiť {číslo = 3; if (true) {throw new Exception ("Test Exception"); } cislo = 2; } catch (Výnimka ex) {návratové číslo; } nakoniec {číslo = 4; } spiatocne cislo; } System.out.println (priradenie ());

Výsledný kód je číslo 3. Aj keď konečne blok sa vykoná vždy, stane sa to až po skús blokové východy.

V príklade návrat vyhlásenie sa vykoná pred Skús chytiť blok končí. Teda zadanie do číslo v konečne blok nemá žiadny efekt, pretože premenná je už vrátená do volacieho kódu apodpis metóda.

Q13. V akých situáciách skús-konečne blok sa dá použiť, aj keď sa výnimky nemusia hodiť?

Tento blok je užitočný, keď sa chceme uistiť, že náhodou neobídeme vyčistenie zdrojov použitých v kóde zistením a prestávka, ďalej alebo návrat vyhlásenie:

HeavyProcess heavyProcess = nový HeavyProcess (); try {// ... return heavyProcess.heavyTask (); } nakoniec {heavyProcess.doCleanUp (); }

Môžeme sa tiež stretnúť so situáciami, v ktorých nedokážeme lokálne zvládnuť vyvolanú výnimku, alebo chceme, aby súčasná metóda vyvolala výnimku stále a zároveň nám umožnila uvoľniť zdroje:

public void doDangerousTask (Task task) hodí ComplicatedException {try {// ... task.gatherResources (); if (task.isComplicated ()) {throw new ComplicatedException ("Príliš ťažké"); } // ...} nakoniec {task.freeResources (); }}

Q14. Ako to robí? vyskúšajte zdroje práca?

The vyskúšajte zdroje vyhlásenie deklaruje a inicializuje jeden alebo viac zdrojov pred vykonaním skús blokuje a automaticky ich zatvára na konci výpisu bez ohľadu na to, či sa blok dokončil normálne alebo náhle. Implementácia ľubovoľného objektu Automatické uzatváranie alebo Uzatvárateľné rozhrania je možné použiť ako zdroj:

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

3. Záver

V tomto článku sme sa venovali niektorým z najčastejšie kladených otázok, ktoré sa vyskytli v technických rozhovoroch pre vývojárov Java, týkajúcich sa príkazov toku riadenia. Toto by sa malo považovať iba za začiatok ďalšieho výskumu, a nie za vyčerpávajúci zoznam.

Veľa šťastia v rozhovore.

Ďalšie » Otázky týkajúce sa rozhovorov o výnimkách Java (+ odpovede) « Predchádzajúce otázky týkajúce sa rozhovorov s generikou Java (+ odpovede)