Java Flow Control Intervju Spørsmål (+ Svar)

Denne artikkelen er en del av en serie: • Java Collections Interview Questions

• Java Type System Interview Questions

• Java-samtalespørsmål om samtidighet (+ svar)

• Spørsmål om Java-klassestruktur og initialisering

• Java 8 intervjuspørsmål (+ svar)

• Minnehåndtering i Java-intervjuspørsmål (+ svar)

• Java Generics intervjuspørsmål (+ svar)

• Intervjuespørsmål med Java Flow Control (+ svar) (nåværende artikkel) • Intervju med Java-unntak (+ svar)

• Spørsmål om Java-merknader (+ svar)

• Spørsmål om topp vårrammeverk

1. Introduksjon

Uttalelser om kontrollflyt tillater utviklere å bruke beslutningstaking, looping og forgrening for å endre betingelsen for gjennomføring av bestemte kodeblokker.

I denne artikkelen vil vi gå gjennom noen spørsmål om flytekontrollintervjuer som kan dukke opp under et intervju og, hvor det er passende; Vi implementerer eksempler for å forstå svarene deres bedre.

2. Spørsmål

Q1. Beskriv hvis da og hvis-da-annet uttalelser. Hvilke typer uttrykk kan brukes som betingelser?

Begge uttalelsene ber vårt program om å utføre koden i dem bare hvis en bestemt tilstand vurderes til ekte. Imidlertid, den hvis-da-annet uttalelse gir en sekundær bane for utførelse i tilfelle if-klausulen evalueres til falsk:

hvis (alder> = 21) {// ...} annet {// ...}

I motsetning til andre programmeringsspråk støtter Java bare boolsk uttrykk som betingelser. Hvis vi prøver å bruke en annen type uttrykk, får vi en kompileringsfeil.

Q2. Beskriv bytte om uttalelse. Hvilke objekttyper kan brukes i bytte om klausul?

Switch tillater valg av flere kjøringsbaner basert på verdien til en variabel.

Hver bane er merket med sak eller misligholde, den bytte om uttalelse evaluerer hver sak uttrykk for en kamp og utfører alle utsagn som følger samsvarende etikett til a gå i stykker uttalelse er funnet. Hvis den ikke finner en kamp, ​​vil misligholde blokken vil bli utført i stedet:

switch (yearsOfJavaExperience) {case 0: System.out.println ("Student"); gå i stykker; sak 1: System.out.println ("Junior"); gå i stykker; tilfelle 2: System.out.println ("Middle"); gå i stykker; standard: System.out.println ("Senior"); }

Vi kan bruke byte, kort, røye, int, deres innpakket versjoner, enums og Strings som bytte om verdier.

Q3. Hva skjer når vi glemmer å sette en gå i stykker uttalelse i en sak klausul om en bytte om?

De bytte om uttalelse faller gjennom. Dette betyr at det vil fortsette utførelsen av alle sak etiketter til hvis finner a gå i stykker uttalelse, selv om disse etikettene ikke samsvarer med uttrykkets verdi.

Her er et eksempel for å demonstrere dette:

int-drift = 2; int tall = 10; switch (operation) {case 1: number = number + 10; gå i stykker; tilfelle 2: nummer = nummer - 4; tilfelle 3: nummer = nummer / 3; tilfelle 4: nummer = nummer * 10; gå i stykker; }

Etter å ha kjørt koden, Nummer holder verdien 20, i stedet for 6. Dette kan være nyttig i situasjoner når vi vil knytte den samme handlingen til flere saker.

Q4. Når er det å foretrekke å bruke en Sheks Over et jegf-Then-Else Uttalelse og omvendt?

EN bytte om setning er bedre egnet når du tester en enkelt variabel mot mange enkeltverdier, eller når flere verdier utfører samme kode:

bytte (måned) {sak 1: sak 3: sak 5: sak 7: sak 8: sak 10: sak 12: dager = 31; gå i stykker; tilfelle 2: dager = 28; gå i stykker; standard: dager = 30; }

An hvis-da-annet uttalelse er å foretrekke når vi trenger å sjekke verdiområder eller flere forhold:

hvis (aPassword == null || aPassword.isEmpty ()) {// tomt passord} ellers hvis (aPassword.length () <8 || aPassword.equals ("12345678")) {// svakt passord} annet {/ / godt passord}

Q5. Hvilke typer løkker støtter Java?

Java tilbyr tre forskjellige typer løkker: til, samtidig som, og gjør mens.

EN til loop gir en måte å gjenta over en rekke verdier. Det er mest nyttig når vi på forhånd vet hvor mange ganger en oppgave skal gjentas:

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

EN samtidig som loop kan utføre en setningsblokk mens en bestemt tilstand er ekte:

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

EN gjør mens er en variant av a samtidig som uttalelse der evalueringen av boolsk uttrykk er nederst i løkken. Dette garanterer at koden vil kjøres minst en gang:

gjør {// ...} mens (valg! = -1);

Q6. Hva er en forbedret for Løkke?

Er en annen syntaks av til uttalelse designet for å gjenta gjennom alle elementene i en samling, matrise, enum eller ethvert objekt som implementerer Iterabel grensesnitt:

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

Q7. Hvordan kan du gå ut forventet fra en løkke?

Bruker gå i stykker uttalelse, kan vi avslutte utførelsen av en løkke umiddelbart:

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

Q8. Hva er forskjellen mellom en umerket og en merket gå i stykker uttalelse?

En umerket gå i stykker uttalelse avslutter det innerste bytte om, til, samtidig som eller gjør mens uttalelse, mens det er merket gå i stykker avslutter utførelsen av en ytre uttalelse.

La oss lage et eksempel for å demonstrere dette:

int [] [] tabell = {{1, 2, 3}, {25, 37, 49}, {55, 68, 93}}; boolsk funnet = falsk; int loopCycles = 0; ytre: for (int [] rader: tabell) {for (int rad: rader) {loopCycles ++; hvis (rad == 37) {funnet = sant; bryte ytre; }}}

Når tallet 37 er funnet, merkes det gå i stykker uttalelse avslutter det ytterste til loop, og ingen flere sykluser utføres. Og dermed, loopCycles slutter med verdien 5.

Imidlertid den umerkede gå i stykker bare avslutter den innerste utsagnet, og returnerer kontrollflyten til det ytterste til som fortsetter løkken til neste rad i bord variabel, noe som gjør loopCycles avslutt med verdien 8.

Q9. Hva er forskjellen mellom en umerket og en merket Fortsette uttalelse?

En umerket Fortsette uttalelse hopper til slutten av gjeldende iterasjon innerst til, samtidig som, eller gjør mens løkke, mens en merket Fortsette hopper til en ytre løkke merket med gitt etikett.

Her er et eksempel som viser dette:

int [] [] tabell = {{1, 15, 3}, {25, 15, 49}, {15, 68, 93}}; int loopCycles = 0; ytre: for (int [] rader: tabell) {for (int rad: rader) {loopCycles ++; hvis (rad == 15) {fortsett ytre; }}}

Begrunnelsen er den samme som i forrige spørsmål. Merket Fortsette uttalelse avslutter det ytterste til Løkke.

Og dermed, loopCycles ender med å holde verdien 5, mens den umerkede versjonen bare avslutter den innerste utsagnet og gjør loopCycles avslutt med verdien 9.

Q10. Beskriv utførelsesstrømmen inne i prøv-fang-endelig konstruere.

Når et program er kommet inn i prøve blokkering, og et unntak blir kastet inni den, utførelsen av prøve blokken blir avbrutt, og strømmen av kontroll fortsetter med en å fange blokk som kan håndtere unntaket som kastes.

Hvis det ikke eksisterer en slik blokk, stopper den nåværende metodeutførelsen, og unntaket kastes til den forrige metoden på samtalestakken. Alternativt, hvis ikke noe unntak forekommer, alle å fange blokkeres, og programkjøringen fortsetter normalt.

EN endelig Blokk utføres alltid om et unntak ble kastet eller ikke inne i kroppen til prøve blokkere.

Q11. I hvilke situasjoner endelig kan det hende at blokk ikke utføres?

Når JVM avsluttes mens du kjører prøve eller å fange blokker, for eksempel ved å ringe System.exit (), eller når den utførende tråden blir avbrutt eller drept, så blir ikke den endelige blokken utført.

Q12. Hva er resultatet av å utføre følgende kode?

offentlig statisk int-oppgave () {int-nummer = 1; prøv {nummer = 3; if (true) {throw new Exception ("Test Exception"); } tall = 2; } fangst (Unntak eks) {returnummer; } til slutt {nummer = 4; } returnummer; } System.out.println (oppgave ());

Koden viser tallet 3. Selv om endelig Blokken utføres alltid, dette skjer først etter prøve blokker utganger.

I eksemplet er komme tilbake uttalelse utføres før prøvefangst blokkeringen ender. Dermed oppdraget til Nummer i endelig blokkerer ingen effekt, siden variabelen allerede er returnert til ringekoden til aunderskrift metode.

Q13. I hvilke situasjoner prøv-endelig blokk kan brukes selv når unntak ikke blir kastet?

Denne blokken er nyttig når vi vil sikre at vi ikke ved et uhell forbi opprydding av ressurser som brukes i koden, ved å støte på a gå i stykker, Fortsette eller komme tilbake uttalelse:

HeavyProcess heavyProcess = ny HeavyProcess (); prøv {// ... return heavyProcess.heavyTask (); } til slutt {heavyProcess.doCleanUp (); }

Vi kan også møte situasjoner der vi ikke lokalt kan håndtere unntaket som kastes, eller vi vil at den gjeldende metoden fortsatt skal kaste unntaket mens vi lar oss frigjøre ressurser:

public void doDangerousTask (Task task) kaster ComplicatedException {try {// ... task.gatherResources (); if (task.isComplicated ()) {throw new ComplicatedException ("For vanskelig"); } // ...} til slutt {task.freeResources (); }}

Q14. Hvordan gjør prøv-med-ressurser arbeid?

De prøv-med-ressurser erklæring erklærer og initialiserer en eller flere ressurser før den kjøres prøve blokkerer og lukker dem automatisk på slutten av uttalelsen, uavhengig av om blokken fullføres normalt eller brått. Ethvert objekt som implementeres Kan lukkes automatisk eller Lukkbar grensesnitt kan brukes som en ressurs:

prøv (StringWriter-forfatter = ny StringWriter ()) {writer.write ("Hallo verden!"); }

3. Konklusjon

I denne artikkelen dekket vi noen av de mest stilte spørsmålene som dukker opp i tekniske intervjuer for Java-utviklere, angående kontrollflytsetninger. Dette skal bare behandles som starten på videre forskning og ikke som en uttømmende liste.

Lykke til i intervjuet ditt.

Neste » Intervju med Java-unntak (+ svar) « Tidligere intervjuspørsmål om Java Generics (+ svar)