Pitanja za intervju za Java Exceptions (+ odgovori)

Ovaj je članak dio serije: • Pitanja za intervju za Java Collections

• Pitanja o intervjuu za sustav tipa Java

• Pitanja za intervju s Java-om (+ odgovori)

• Struktura Java razreda i pitanja za intervju za inicijalizaciju

• Java 8 pitanja za intervju (+ odgovori)

• Upravljanje memorijom u Java intervjuu Pitanja (+ odgovori)

• Pitanja o intervjuu za Java Generics (+ odgovori)

• Pitanja za intervju s Java Flow Control (+ odgovori)

• Pitanja o intervjuu za Java Exceptions (+ odgovori) (trenutni članak) • Pitanja o intervjuu za Java Annotations (+ odgovori)

• Najpopularnija pitanja za proljetni okvirni intervju

1. Pregled

Iznimke su bitna tema koju bi svaki programer Java trebao poznavati. Ovaj članak daje odgovore na neka pitanja koja se mogu pojaviti tijekom intervjua.

2. Pitanja

Q1. Što je iznimka?

Iznimka je abnormalni događaj koji se dogodi tijekom izvršavanja programa i poremeti normalan tijek uputa programa.

Q2. Koja je svrha bacanja i bacanja ključnih riječi?

The baca Ključna riječ koristi se za specificiranje da metoda može pokrenuti iznimku tijekom svog izvođenja. Provodi eksplicitno rukovanje iznimkama prilikom pozivanja metode:

public void simpleMethod () baca iznimku {// ...}

The bacanje ključna riječ omogućuje nam bacanje objekta iznimke kako bismo prekinuli normalan tijek programa. To se najčešće koristi kada program ne zadovoljava zadani uvjet:

if (task.isTooComplicated ()) {throw new TooComplicatedException ("Zadatak je prekompliciran"); }

Q3. Kako se možete nositi s iznimkom?

Korištenjem a probaj-uhvati-napokon izjava:

isprobajte {// ...} catch (ExceptionType1 ex) {// ...} catch (ExceptionType2 ex) {// ...} napokon {// ...}

Blok koda u kojem se može dogoditi iznimka zatvoren je u probati blok. Ovaj se blok naziva i "zaštićenim" ili "zaštićenim" kodom.

Ako se dogodi iznimka, ulov izvršava se blok koji se podudara s izuzećem koji se baca, ako ne, svi ulov blokovi se zanemaruju.

The konačno blok se uvijek izvršava nakon probati blok izlazi, bez obzira je li izuzetak ubačen u njega ili ne.

Q4. Kako možete uhvatiti višestruke iznimke?

Postoje tri načina za rukovanje višestrukim iznimkama u bloku koda.

Prvo je korištenje a ulov blok koji može obraditi sve vrste izuzetaka koje se bacaju:

pokušajte {// ...} uhvatiti (izuzetak ex) {// ...}

Trebate imati na umu da je preporučena praksa koristiti što preciznije rukovatelje iznimkama.

Preširoki rukovatelji iznimkama mogu vaš kod učiniti sklonijim pogreškama, uhvatiti iznimke koje nisu predviđene i izazvati neočekivano ponašanje u vašem programu.

Drugi način je implementacija više blokova ulova:

isprobajte {// ...} catch (FileNotFoundException ex) {// ...} catch (EOFException ex) {// ...}

Imajte na umu da, ako iznimke imaju nasljedni odnos; tip djeteta mora biti na prvom mjestu, a roditelj kasnije. Ako to ne uspijemo, rezultirat će pogreškom u kompilaciji.

Treće je korištenje bloka s više ulova:

isprobajte {// ...} catch (FileNotFoundException | EOFException ex) {// ...}

Ova je značajka prvi put predstavljena u Javi 7; smanjuje dupliciranje koda i olakšava održavanje.

P5. Koja je razlika između provjerene i neprovjerene iznimke?

Označena iznimka mora se riješiti u roku od pokušaj uhvatiti blok ili deklariran u a baca klauzula; dok se s neprovjerenom iznimkom ne zahtijeva rukovanje niti prijavljivanje.

Provjerene i neprovjerene iznimke također su poznate kao iznimke za vrijeme prevođenja i izvršavanja.

Sve iznimke su provjerene iznimke, osim onih označenih s Pogreška, RuntimeExceptioni njihove podrazrede.

P6. Koja je razlika između iznimke i pogreške?

Iznimka je događaj koji predstavlja stanje iz kojeg se može oporaviti, dok pogreška predstavlja vanjsku situaciju koju je obično nemoguće oporaviti.

Sve pogreške koje je bacio JVM su instance Pogreška ili jedna od njegovih potklasa, one uobičajenije uključuju, ali nisu ograničene na:

  • OutOfMemoryError - bačeno kad JVM ne može dodijeliti više objekata jer nema memorije, a sakupljač smeća nije mogao učiniti dostupnijim
  • StackOverflowError - događa se kad je prostor za stog za nit istekao, obično zato što se aplikacija preduboko ponavlja
  • ExceptionInInitializerError - signalizira da se tijekom procjene statičkog inicijalizatora dogodila neočekivana iznimka
  • NoClassDefFoundError - baca se kada učitelj učitelja pokušava učitati definiciju klase i nije je mogao pronaći, obično zato što je potrebna razred datoteke nisu pronađene u stazi predavanja
  • UnsupportedClassVersionError - događa se kada JVM pokušava pročitati a razred datoteku i utvrđuje da inačica u datoteci nije podržana, obično zato što je datoteka generirana novijom verzijom Jave

Iako se pogreška može riješiti pomoću probati izjava, ovo nije preporučljiva praksa jer ne postoji jamstvo da će program moći nešto pouzdano učiniti nakon uklanjanja pogreške.

P7. Koja će se iznimka baciti izvršavajući sljedeći blok koda?

Cijeli broj [] [] ints = {{1, 2, 3}, {null}, {7, 8, 9}}; System.out.println ("value =" + ints [1] [1] .intValue ());

Baca ArrayIndexOutOfBoundsException budući da pokušavamo pristupiti položaju većem od duljine niza.

P8. Što je lanac izuzetaka?

Pojavljuje se kada se izuzetak baci kao odgovor na drugu iznimku. To nam omogućuje otkrivanje cjelokupne povijesti našeg postavljenog problema:

isprobajte {task.readConfigFile (); } catch (FileNotFoundException ex) {throw new TaskException ("Nije moguće izvršiti zadatak", ex); }

P9. Što je stacktrace i kako se to odnosi na iznimku?

Trag steka daje imena klasa i metoda koje su pozvane, od početka aplikacije do točke kada se dogodila iznimka.

To je vrlo koristan alat za uklanjanje pogrešaka jer nam omogućuje da točno utvrdimo gdje je izuzetak ubačen u aplikaciju i izvorni uzroci koji su do njega doveli.

Q10. Zašto biste željeli podrazred izuzetak?

Ako vrstu iznimke ne predstavljaju one koje već postoje na Java platformi ili ako klijentskom kodu trebate pružiti više informacija da biste je preciznije tretirali, tada biste trebali stvoriti prilagođenu iznimku.

Odluka treba li provjeriti ili poništiti prilagođenu iznimku u potpunosti ovisi o poslovnom slučaju. Međutim, u pravilu; ako se može očekivati ​​da će se kod koji koristi vašu iznimku oporaviti od njega, tada stvorite provjerenu iznimku, u suprotnom neka bude neaktivirana.

Također, trebali biste naslijediti od najspecifičnijih Iznimka potklasa koja je usko povezana s onom koju želite baciti. Ako ne postoji takva klasa, onda odaberite Iznimka kao roditelj.

Q11. Koje su neke prednosti iznimki?

Tradicionalne tehnike otkrivanja pogrešaka i rukovanja njima često dovode do toga da se kod špageta teško održava i koji se teško čita. Međutim, iznimke nam omogućuju razdvajanje temeljne logike naše aplikacije od detalja što učiniti kada se dogodi nešto neočekivano.

Također, budući da JVM pretražuje unatrag niz poziva kako bi pronašao bilo koje metode zainteresirane za rukovanje određenom iznimkom; stječemo sposobnost širenja pogreške u hrpi poziva bez pisanja dodatnog koda.

Također, budući da su sve iznimke bačene u programu objekti, oni se mogu grupirati ili kategorizirati na temelju njegove hijerarhije klasa. To nam omogućuje da uhvatimo skupinu iznimaka u jednom obrađivaču izuzetaka navođenjem superklase iznimke u ulov blok.

Q12. Možete li ubaciti bilo kakvu iznimku u tijelo Lambda izraza?

Kada koristite standardno funkcionalno sučelje koje Java već nudi, možete baciti samo neprovjerene iznimke jer standardno funkcionalno sučelje nema klauzulu "bacanja" u potpisima metode:

Popis cijelih brojeva = 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);});

Međutim, ako koristite prilagođeno funkcionalno sučelje, moguće je bacanje provjerenih iznimaka:

@FunctionalInterface javno statičko sučelje CheckedFunction {void apply (T t) baca iznimku; }
public void processTasks (Popis zadataka, CheckedFunction CheckedFunction) {for (Zadatak zadatka: taks) {try {checkedFunction.apply (zadatak); } catch (Exception e) {// ...}}} processTasks (taskList, t -> {// ... baciti novu iznimku ("Nešto se dogodilo");});

Q13. Koja su pravila koja se trebamo pridržavati prilikom nadjačavanja metode koja donosi izuzetak?

Nekoliko pravila nalaže kako se iznimke moraju deklarirati u kontekstu nasljeđivanja.

Kada metoda roditeljske klase ne izbaci iznimke, metoda podređene klase ne može baciti nijednu provjerenu iznimku, ali može baciti bilo koju neprovjerenu.

Evo primjera koda koji to pokazuje:

class Parent {void doSomething () {// ...}} class Child produžuje Parent {void doSomething () baca IllegalArgumentException {// ...}}

Sljedeći primjer neće uspjeti kompajlirati jer metoda nadjačavanja baca provjerenu iznimku koja nije deklarirana u nadjačanoj metodi:

class Parent {void doSomething () {// ...}} class Child produžuje Parent {void doSomething () baca IOException {// Pogreška kompilacije}}

Kada metoda roditeljske klase baci jednu ili više provjerenih iznimki, metoda podređene klase može baciti bilo koju neprovjerenu iznimku; svi, nijedan ili podskup deklariranih provjerenih iznimaka, pa čak i veći broj njih sve dok imaju isti opseg ili uži.

Evo primjera koda koji uspješno slijedi prethodno pravilo:

klasa Roditelj {void doSomething () baca IOException, ParseException {// ...} void doSomethingElse () baca IOException {// ...}} class Child produžuje Roditelj {void doSomething () baca IOException {// ...} void doSomethingElse () baca FileNotFoundException, EOFException {// ...}}

Imajte na umu da obje metode poštuju pravilo. Prva baca manje iznimki od nadjačane metode, a druga, iako baca više; užeg su opsega.

Međutim, ako pokušamo baciti provjerenu iznimku koju metoda roditeljske klase ne deklarira ili bacimo onu šireg opsega; dobit ćemo pogrešku u kompilaciji:

class Roditelj {void doSomething () baca FileNotFoundException {// ...}} class Child produžuje Roditelj {void doSomething () baca IOException {// Pogreška kompilacije}}

Kada metoda roditeljske klase ima klauzulu throws s neprovjerenom iznimkom, metoda podređene klase ne može izbaciti nijedan ili bilo koji broj neprovjerenih izuzetaka, iako nisu povezane.

Evo primjera koji poštuje pravilo:

klasa Roditelj {void doSomething () baca IllegalArgumentException {// ...}} klasa Dijete produžuje Roditelj {void doSomething () baca ArithmeticException, BufferOverflowException {// ...}}

P14. Hoće li se sastaviti sljedeći kod?

void doSomething () {// ... baciti novi RuntimeException (novi izuzetak ("Chained Exception")); }

Da. Kada lancuje iznimke, sastavljač brine samo o prvom u lancu i, jer otkriva neprovjerenu iznimku, ne trebamo dodavati klauzulu.

P15. Postoji li način da se izbaci izuzetak iz metode koja nema klauzulu o bacanju?

Da. Možemo iskoristiti brisanje tipa koje je izveo kompajler i pomisliti da bacamo neprovjerenu iznimku, kada u stvari; bacamo provjerenu iznimku:

public T sneakyThrow (Throwable ex) baca T {throw (T) ex; } javna void metodaWithoutThrows () {this.sneakyThrow (nova iznimka ("Označena iznimka")); }

3. Zaključak

U ovom smo članku istražili neka pitanja koja će se vjerojatno pojaviti u tehničkim intervjuima za programere Java, u vezi s iznimkama. Ovo nije iscrpan popis i trebalo bi ga tretirati samo kao početak daljnjih istraživanja.

Mi iz tvrtke Baeldung želimo vam uspjeh u svim nadolazećim intervjuima.

Sljedeći » Pitanja za intervju s Java Annotations (+ odgovori) « Prethodna pitanja o intervjuu za kontrolu protoka Java (+ odgovori)