Otázky týkajúce sa rozhovorov o výnimkách 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 riadenia toku Java (+ odpovede)

• Otázky rozhovoru pre Java Výnimky (+ odpovede) (aktuálny článok) • Otázky rozhovoru pre Java poznámky (+ odpovede)

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

1. Prehľad

Výnimky sú zásadnou témou, ktorú by mal poznať každý vývojár Java. Tento článok poskytuje odpovede na niektoré otázky, ktoré sa môžu počas pohovoru objaviť.

2. Otázky

Q1. Čo je to výnimka?

Výnimkou je abnormálna udalosť, ktorá sa vyskytne počas vykonávania programu a naruší normálny priebeh pokynov programu.

Q2. Aký je účel hodu a hádzania kľúčových slov?

The hodí kľúčové slovo sa používa na určenie, že metóda môže počas vykonávania vyvolať výnimku. Pri volaní metódy vynúti explicitné spracovanie výnimiek:

public void simpleMethod () vyvolá výnimku {// ...}

The hodiť kľúčové slovo nám umožňuje vyhodiť objekt výnimky, aby sme prerušili normálny priebeh programu. Najčastejšie sa to používa, keď program nedokáže splniť danú podmienku:

if (task.isTooComplicated ()) {throw new TooComplicatedException ("Úloha je príliš komplikovaná"); }

Q3. Ako môžete vyriešiť výnimku?

Použitím a skús chytiť-konečne vyhlásenie:

skúste {// ...} chytiť (ExceptionType1 ex) {// ...} chytiť (ExceptionType2 ex) {// ...} konečne {// ...}

Blok kódu, v ktorom môže dôjsť k výnimke, je uzavretý v a skús blokovať. Tento blok sa tiež nazýva „chránený“ alebo „strážený“ kód.

Ak dôjde k výnimke, chytiť blok, ktorý sa zhoduje s vyvolanou výnimkou, sa vykoná, ak nie, všetky chytiť bloky sú ignorované.

The konečne blok sa vykoná vždy po skús výstupy z bloku, bez ohľadu na to, či bola do nej hodená výnimka alebo nie.

Q4. Ako môžete zachytiť viac výnimiek?

Existujú tri spôsoby spracovania viacerých výnimiek v bloku kódu.

Prvým je použitie a chytiť blok, ktorý dokáže spracovať všetky vyvolávané typy výnimiek:

skúste {// ...} chytiť (výnimka okrem) {// ...}

Mali by ste mať na pamäti, že odporúčanou praxou je používať obslužné rutiny výnimiek čo najpresnejšie.

Príliš široké obslužné rutiny výnimiek môžu spôsobiť, že váš kód bude náchylnejší na chyby, zachytia výnimky, ktoré sa neočakávali, a spôsobia neočakávané správanie vášho programu.

Druhým spôsobom je implementácia viacerých blokov úlovku:

skúste {// ...} chytiť (FileNotFoundException ex) {// ...} chytiť (EOFException ex) {// ...}

Upozorňujeme, že ak majú výnimky dedičský vzťah; najskôr musí byť podradený typ a neskôr nadradený typ. Ak to neurobíme, bude to mať za následok chybu kompilácie.

Tretie v poradí je použitie bloku viacerých úlovkov:

skúste {// ...} chytiť (FileNotFoundException | EOFException ex) {// ...}

Táto funkcia bola prvýkrát predstavená v prostredí Java 7; znižuje duplikáciu kódu a uľahčuje jeho údržbu.

Q5. Aký je rozdiel medzi skontrolovanou a nezaškrtnutou výnimkou?

Skontrolovaná výnimka musí byť spracovaná v rámci a Skús chytiť blok alebo deklarované v a hodí doložka; zatiaľ čo sa nevyžaduje, aby sa s nekontrolovanou výnimkou zaobchádzalo, ani aby sa vyhlasovala.

Začiarknuté a nezačiarknuté výnimky sú známe aj ako výnimky v čase kompilácie a runtime.

Všetky výnimky sú začiarknuté, okrem tých, ktoré sú označené symbolom Chyba, RuntimeExceptiona ich podtriedy.

Q6. Aký je rozdiel medzi výnimkou a chybou?

Výnimkou je udalosť, ktorá predstavuje stav, z ktorého je možné zotaviť sa, zatiaľ čo chyba predstavuje vonkajšiu situáciu, z ktorej sa obvykle nedá zotaviť.

Všetky chyby vyvolané JVM sú inštanciami Chyba alebo jedna z jeho podtried, tie najbežnejšie zahŕňajú, ale nie sú obmedzené na:

  • OutOfMemoryError - vyhodené, keď JVM nemôže alokovať viac objektov, pretože nemá pamäť a zberač odpadu nedokázal sprístupniť viac
  • StackOverflowError - nastane, keď sa vyčerpal priestor zásobníka pre vlákno, zvyčajne preto, že sa aplikácia opakuje príliš hlboko
  • ExceptionInInitializerError - signalizuje, že počas vyhodnotenia statického inicializátora došlo k neočakávanej výnimke
  • NoClassDefFoundError - je vyhodený, keď sa triedny nakladač pokúša načítať definíciu triedy a nemohol ju nájsť, zvyčajne preto, lebo je to potrebné trieda súbory sa v triede cesty nenašli
  • UnsupportedClassVersionError - nastane, keď sa JVM pokúsi prečítať a trieda súbor a zistí, že verzia v súbore nie je podporovaná, zvyčajne preto, že bol súbor vygenerovaný s novšou verziou Java

Aj keď chybu je možné vyriešiť pomocou a skús vyhlásenie, toto nie je odporúčaný postup, pretože neexistuje žiadna záruka, že program bude schopný hodiť niečo spoľahlivo po vyhodení chyby.

Q7. Aká výnimka bude vyvolaná vykonaním nasledujúceho bloku kódu?

Celé číslo [] [] ints = {{1, 2, 3}, {null}, {7, 8, 9}}; System.out.println ("value =" + ints [1] [1] .intValue ());

Hodí to ArrayIndexOutOfBoundsException pretože sa snažíme dostať na pozíciu väčšiu ako je dĺžka poľa.

Q8. Čo je to reťazenie výnimiek?

Nastane, keď je vyvolaná výnimka ako odpoveď na inú výnimku. To nám umožňuje odhaliť úplnú históriu nášho nastoleného problému:

try {task.readConfigFile (); } catch (FileNotFoundException ex) {throw new TaskException ("Could not perform task", ex); }

Q9. Čo je to Stacktrace a ako súvisí s výnimkou?

Trasovanie zásobníka poskytuje názvy tried a metód, ktoré boli volané, od spustenia aplikácie do bodu, v ktorom došlo k výnimke.

Je to veľmi užitočný nástroj na ladenie, pretože nám umožňuje presne určiť, kde bola v aplikácii vyvolaná výnimka, a pôvodné príčiny, ktoré k nej viedli.

Q10. Prečo by ste chceli zaradiť výnimku do podtriedy?

Ak typ výnimky nie je reprezentovaný tými, ktoré už existujú na platforme Java, alebo ak potrebujete poskytnúť viac informácií o kóde klienta, aby ste s ním zaobchádzali presnejším spôsobom, mali by ste vytvoriť vlastnú výnimku.

Rozhodnutie, či je potrebné skontrolovať alebo zrušiť začiarknutie vlastnej výnimky, závisí výlučne od obchodného prípadu. Ako pravidlo však; ak sa dá očakávať, že sa z neho obnoví kód, ktorý používa vašu výnimku, potom vytvorte kontrolovanú výnimku, inak ju zrušte.

Mali by ste dediť aj od tých najkonkrétnejších Výnimka podtrieda, ktorá úzko súvisí s tou, ktorú chcete hodiť. Ak takáto trieda neexistuje, vyberte si Výnimka ako rodič.

Q11. Aké sú výhody výnimiek?

Tradičné techniky detekcie chýb a manipulácie s nimi často vedú k tomu, že špagetový kód je ťažko udržiavateľný a ťažko čitateľný. Výnimky nám však umožňujú oddeliť základnú logiku našej aplikácie od podrobností, čo robiť, keď sa stane niečo neočakávané.

Pretože JVM vyhľadáva spätne v zásobníku hovorov aj nejaké metódy zaujímajúce sa o manipuláciu s konkrétnou výnimkou; získame schopnosť šíriť chybu v zásobníku hovorov bez toho, aby sme písali ďalší kód.

Pretože všetky výnimky vyvolané programom sú objektmi, dajú sa zoskupiť alebo kategorizovať na základe jeho hierarchie tried. To nám umožňuje zachytiť skupinu výnimiek v jednej obsluhe výnimiek zadaním nadtriedy výnimky v chytiť blokovať.

Q12. Môžete hodiť nejakú výnimku do tela výrazu lambda?

Pri použití štandardného funkčného rozhrania, ktoré už poskytuje Java, môžete hádzať iba nezaškrtnuté výnimky, pretože štandardné funkčné rozhrania nemajú v podpisoch metód klauzulu „throws“:

Zoznam celých čísel = Arrays.asList (3, 9, 7, 0, 10, 20); integers.forEach (i -> {if (i == 0) {throw new IllegalArgumentException ("Zero not allowed");} System.out.println (Math.PI / i);});

Ak však používate vlastné funkčné rozhranie, je možné hádzať kontrolované výnimky:

@FunctionalInterface verejné statické rozhranie CheckedFunction {void apply (T t) vyvolá výnimku; }
public void processTasks (List taks, CheckedFunction checkedFunction) {for (Task task: taks) {try {checkedFunction.apply (task); } catch (Výnimka e) {// ...}}} processTasks (taskList, t -> {// ... hodiť novú Výnimku („Niečo sa stalo“);});

Q13. Aké sú pravidlá, ktoré musíme dodržiavať pri prekonaní metódy, ktorá vyvoláva výnimku?

Niekoľko pravidiel určuje, ako sa musia v rámci dedičstva vyhlasovať výnimky.

Keď metóda nadradenej triedy nevrhá žiadne výnimky, metóda podradenej triedy nemôže hádzať žiadne kontrolované výnimky, ale môže hádzať všetky nezačiarknuté.

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

class Parent {void doSomething () {// ...}} class Child extends Parent {void doSomething () throws IllegalArgumentException {// ...}}

Nasledujúci príklad sa nepodarí skompilovať, pretože prepísaná metóda vyvolá kontrolovanú výnimku, ktorá nie je deklarovaná v prepísanej metóde:

class Parent {void doSomething () {// ...}} class Child extends Parent {void doSomething () throws IOException {// Compilation error}}

Keď metóda nadradenej triedy vyvolá jednu alebo viac kontrolovaných výnimiek, metóda podradenej triedy môže vyvolať ľubovoľnú nekontrolovanú výnimku; všetky, žiadna alebo podmnožina deklarovaných kontrolovaných výnimiek, a ešte väčší počet z nich, pokiaľ majú rovnaký rozsah alebo užší rozsah.

Tu je príklad kódu, ktorý úspešne dodržiava predchádzajúce pravidlo:

trieda Parent {void doSomething () hodí IOException, ParseException {// ...} void doSomethingElse () hodí IOException {// ...}} trieda Child rozšíri Parent {void doSomething () hodí IOException {// ...} void doSomethingElse () hodí FileNotFoundException, EOFException {// ...}}

Upozorňujeme, že obe metódy toto pravidlo rešpektujú. Prvý hodí menej výnimiek ako prepísaná metóda a druhý, aj keď hodí viac; majú užší rozsah.

Ak sa však pokúsime hodiť kontrolovanú výnimku, ktorú metóda rodičovskej triedy nedeklaruje, alebo hodíme jednu so širším rozsahom; dostaneme chybu kompilácie:

class Parent {void doSomething () throws FileNotFoundException {// ...}} class Child extends Parent {void doSomething () throws IOException {// Compilation error}}

Keď má metóda nadradenej triedy klauzulu throws s nekontrolovanou výnimkou, metóda podradenej triedy môže vrhnúť žiadnu alebo ľubovoľný počet nekontrolovaných výnimiek, aj keď spolu nesúvisia.

Tu je príklad, ktorý ctí pravidlo:

trieda Parent {void doSomething () hodí IllegalArgumentException {// ...}} trieda Child rozšíri Parent {void doSomething () hodí ArithmeticException, BufferOverflowException {// ...}}

Q14. Bude sa kompilovať nasledujúci kód?

void doSomething () {// ... hodiť nový RuntimeException (new Exception ("Chained Exception")); }

Áno. Pri spájaní výnimiek sa kompilátoru stará iba o prvý v reťazci a pretože zistí nekontrolovanú výnimku, nemusíme pridávať klauzulu throws.

Q15. Existuje nejaký spôsob hodenia zaškrtnutej výnimky z metódy, ktorá nemá klauzulu o hode?

Áno. Môžeme využiť vymazanie typu vykonané kompilátorom a prinútiť ho myslieť si, že vrháme nekontrolovanú výnimku, hoci v skutočnosti; vrháme zaškrtnutú výnimku:

public T sneakyThrow (Throwable ex) hodí T {throw (T) ex; } public void methodWithoutThrows () {this.sneakyThrow (nová výnimka ("kontrolovaná výnimka")); }

3. Záver

V tomto článku sme sa zaoberali niektorými otázkami, ktoré sa pravdepodobne objavia v technických rozhovoroch pre vývojárov Java, pokiaľ ide o výnimky. Toto nie je vyčerpávajúci zoznam a malo by sa k nemu pristupovať iba ako k začiatku ďalšieho výskumu.

My v Baeldungu vám prajeme úspech v akýchkoľvek nadchádzajúcich rozhovoroch.

Ďalšie » Anotácie Java Dotazy na rozhovor (+ odpovede) « Predchádzajúce otázky týkajúce sa riadenia toku Java (+ odpovede)

$config[zx-auto] not found$config[zx-overlay] not found