Kako se na pravi način nositi s Java iznimkama

  • Harry James
  • 0
  • 908
  • 37
Oglas

Kao novak u programiranju Kako naučiti programiranje bez svih stresova Kako naučiti programiranje bez ikakvog stresa Možda ste se odlučili baviti programiranjem bilo za karijeru ili samo kao hobi. Sjajno! Ali možda se počinjete osjećati preplavljeno. Nije tako sjajno. Evo pomoći da vam olakša putovanje. , pojam rukovanje izuzetkom može biti teško zamotati glavu. Nije da je sam koncept težak, ali terminologija ga može učiniti naprednijim nego što jest. I to je tako moćna značajka da je sklona zlouporabi i zlouporabi.

U ovom ćete članku naučiti što su iznimke, zašto su važne, kako ih koristiti i česte pogreške koje treba izbjegavati. Većina suvremenih jezika 6 Najlakše programske jezike za učenje za početnike 6 Najlakši programski jezici za učenje za početnike Učenje za programiranje podrazumijeva pronalaženje pravog jezika jednako kao i za postupak izgradnje. Slijedi prvih šest najlakših programskih jezika za početnike. imate neku vrstu rukovanja iznimkama, pa ako ikad prijeđete s Jave 7 Korisni trikovi za savladavanje novog jezika programiranja 7 Korisni trikovi za savladavanje novog jezika programiranja U redu je biti preopterećen kada učite kodirati. Vjerojatno ćete zaboraviti stvari čim ih naučite. Ovi savjeti mogu vam pomoći da bolje zadržite sve te nove informacije. , većinu ovih savjeta možete ponijeti sa sobom.

Razumijevanje Java izuzetaka

U Javi, an izuzetak je objekt koji označava nešto nenormalno (ili “izuzetan”) dogodilo se tijekom pokretanja vaše aplikacije. Takvi su izuzeci bačen, što u osnovi znači da se stvara izuzetak (slično kao i pogreške) “uzdignut”).

Ljepota je u tome što možete ulov izbačene iznimke, što vam omogućuje da se nosite s nenormalnim stanjem i dopušta da se vaša aplikacija nastavi pokretati kao da ništa nije pošlo po zlu. Na primjer, dok bi nulti pokazivač na C mogao srušiti vašu aplikaciju, Java vam omogućuje bacanje i hvatanje NullPointerExceptions prije nego što jedna nulto varijabla ima priliku izazvati pad.

Zapamtite, iznimka je samo objekt, ali s jednom važnom karakteristikom: mora se proširiti s izuzetak klase ili bilo kojeg podrazreda izuzetak. Iako Java ima sve vrste ugrađenih iznimki, po želji možete stvoriti i svoju. Neke od najčešćih Java izuzetaka uključuju:

  • NullPointerException
  • NumberFormatException
  • IllegalArgumentException
  • RuntimeException
  • IllegalStateException

Pa što se događa kad bacite iznimku?

Prvo, Java promatra neposrednu metodu da vidi postoji li kôd koji obrađuje vrstu iznimke koju ste bacili. Ako rukovatelj ne postoji, pregledava metodu koja je pozvala trenutnu metodu da vidi postoji li rukohvat tamo. Ako ne, pregledava metodu koja je pozvala da metoda, a zatim sljedeću metodu itd. Ako izuzetak nije uhvaćen, aplikacija ispisuje trag stoga i zatim se ruši. (Zapravo je to nijansiranije od jednostavnog rušenja, ali to je napredna tema izvan okvira ovog članka.)

stag trag je popis svih metoda koje je Java prešao dok je tražio izvođač iznimke. Evo kako izgleda trag snopa:

Izuzetak u temi "glavni" java.lang.NullPointerException na com.example.myproject.Book.getTitle (Book.java:16) na com.example.myproject.Author.getBookTitles (Author.java:25) na com.example. myproject.Bootstrap.main (Bootstrap.java:14)

Iz ovoga možemo puno toga dobiti. Prvo, bačena izuzetak bio je a NullPointerException. Dogodilo se u getTitle () metoda na liniji 16 Book.java. Ta metoda je nazvana iz getBookTitles () na liniji 25 od Autor.java. Da metoda je pozvana iz glavni() na liniji 14 od Bootstrap.java. Kao što vidite, poznavanje svega toga olakšava uklanjanje pogrešaka.

Ali opet, prava korist izuzetaka je da možete “rukovati” nenormalno stanje hvatanjem iznimke, ispravljanjem stvari i nastavljanjem aplikacije bez rušenja.

Korištenje Java iznimki u kodu

Recimo da imate someMethod () koji uzima cijeli broj i izvršava neku logiku koja se može slomiti ako je cijeli broj manji od 0 ili veći od 100. To bi moglo biti dobro mjesto za izuzeće:

javna void someMethod (int vrijednost) if (vrijednost 100) baciti new IllegalArgumentException();  //…

Da biste uhvatili ovu iznimku, morate krenuti kamo someMethod () zove se i koristi pokušaj-uloženi blok:

javna void callMethod () pokušaj someMethod (200); someOtherMethod ();  hvatanje (IllegalArgumentException e) // ovdje obradite iznimku //…

Sve unutar probati blok će se izvršavati kako bi se izuzeo izuzetak. Čim se baci iznimka, sve naredne izjave preskaču se i logika aplikacije odmah skače na ulov blok.

U našem primjeru ulazimo u probani blok i odmah zovemo someMethod (). Budući da 200 nije između 0 i 100, an IllegalArgumentException je bačen. Time se odmah završava izvršenje someMethod (), preskače ostatak logike u pokušaju bloku (someOtherMethod () nikad se ne poziva) i nastavlja izvršenje unutar bloka hvatanja.

Što bi se dogodilo da nazovemo someMethod (50) umjesto toga? IllegalArgumentException nikad se ne bi bacili. someMethod () izvršio bi se kao normalno. Blok pokušaja izvršit će se kao i obično, pozivajući someOtherMethod () kad se nekiMethod () dovrši. Kada someOtherMethod () završava, blok ulova bi se preskočio i callingMethod () nastavio bi.

Imajte na umu da možete imati više blokova ulova po pokušaju:

javna void callMethod () pokušaj someMethod (200); someOtherMethod ();  catch (IllegalArgumentException e) // ovdje obradite iznimku catch (NullPointerException e) // ovdje obradite iznimku //…

Također imajte na umu da izborno konačno i blok postoji:

javna void metoda () pokušaj //… ulov (Izuzetak e) //… napokon //…

Kod unutar konačno blokiranog je stalno pogubljen bez obzira na sve. Ako imate povratnu izjavu u pokušaju bloka, konačno se blok izvršava prije povratka iz metode. Ako bacite drugu iznimku u blok hvatanja, konačno se blok izvršava prije nego što se izuzetak baci.

Konačni blok trebali biste koristiti kada imate predmete koje treba očistiti prije nego što se metoda završi. Na primjer, ako ste otvorili datoteku u pokušaju, a kasnije bacili izuzetak, konačni blok omogućava vam da zatvorite datoteku prije nego što napustite metodu.

Imajte na umu da konačno možete imati blok bez bloka hvatanja:

javna nevažeća metoda () pokušaj //… napokon //…

To vam omogućuje da napravite bilo kakvo potrebno čišćenje, dok dopuštate izuzetim iznimkama da šire propagaciju skupa poziva poziva (tj. Ovdje ne želite obrađivati ​​izuzetak, ali prvo morate očistiti).

Provjereno u odnosu na neprovjerene iznimke na Javi

Za razliku od većine jezika, Java razlikuje između provjerene iznimke i neprovjerene iznimke (npr. C # ima samo neprovjerene iznimke). Provjerena iznimka mora biti uhvaćen u metodi gdje se baca izuzetak ili se inače kod ne može sastaviti.

Da biste stvorili provjerenu iznimku, produžite iz izuzetak. Da biste stvorili neprovjerenu iznimku, produžite iz RuntimeException.

Svaka metoda koja baca označenu iznimku mora to označiti u potpisu metode pomoću znaka baca ključne riječi. Otkad je Java ugrađena IOException je označena iznimka, sljedeći se kôd neće kompilirati:

javna void wontCompile () //… if (someCondition) baci novi IOException ();  //…

Prvo morate izjaviti da baca provjereni izuzetak:

javna void willCompile () baca IOException //… ako (someCondition) baci novi IOException ();  //…

Imajte na umu da se metoda može proglasiti izbacivanjem iznimke, ali nikada ne izbacuje izuzetak. Uprkos tome, iznimka će se i dalje morati uhvatiti, inače se kôd neće sastaviti.

Kada biste trebali koristiti provjerene ili neprovjerene iznimke?

Službena Java dokumentacija ima stranicu na ovom pitanju. Razlikuje sažetkom s kratkim pravilom: “Ako se opravdano može očekivati ​​da se klijent može oporaviti od iznimke, učini ga provjerenom iznimkom. Ako klijent ne može učiniti ništa kako bi se oporavio od iznimke, učini to neprovjerenom iznimkom.”

Ali ta smjernica može biti zastarjela. S jedne strane, provjerene iznimke rezultiraju snažnijim kodom 10 Savjeti za pisanje čistije i bolji kod 10 Savjeti za pisanje čistije i bolji kod Pisanje čistog koda izgleda lakše nego što zapravo jest, ali prednosti su vrijedne toga. Evo kako danas možete početi pisati čistiji kod. , S druge strane, nijedan drugi jezik nije provjerio iznimke na isti način kao Java, što pokazuje dvije stvari: jedna, značajka nije dovoljno korisna da je drugi jezici ukradu, a dva, možete bez njih apsolutno živjeti. Uz to, provjereni izuzeci ne igraju se lijepo s lambda izrazima uvedenima u Javi 8.

Smjernice za upotrebu iznimki u Javi

Iznimke su korisne, ali lako se zloupotrijebe i zloupotrijebe. Evo nekoliko savjeta i najboljih iskustava koji će vam pomoći da ne napravite nered od njih.

  • Preferirajte posebne iznimke od općih iznimki. Koristiti NumberFormatException nad IllegalArgumentException ako je moguće, u protivnom upotrijebite IllegalArgumentException nad RuntimeException kad je to moguće.
  • Nikad ne uhvatite Za odbaciti! izuzetak klasa se zapravo proširuje Za odbaciti, i blok hvata zapravo radi sa Za odbaciti ili bilo koju klasu koja se proteže za Throwable. Međutim greška klasa se također proširuje Za odbaciti, i nikad ga ne želite uhvatiti greška jer greškas ukazuju na ozbiljna nerešiva ​​pitanja.
  • Nikad ne uhvatite izuzetak! InterruptedException proteže se izuzetak, pa svaki blok koji hvata izuzetak također će uhvatiti InterruptedException, i to je vrlo važna iznimka s kojom se ne želite posvađati (posebno u aplikacijama s više navoja) osim ako ne znate što radite. Ako ne znate koji izuzetak umjesto toga, uhvatite nešto.
  • Upotrijebite opisne poruke kako biste olakšali ispravljanje pogrešaka. Kad izbacite iznimku, možete unijeti Niz poruka kao argument. Ovoj se poruci može pristupiti u bloku zahvata pomoću gumba Exception.getMessage () metoda, ali ako se iznimka nikad ne uhvati, poruka će se također pojaviti kao dio praćenja snopa.
  • Pokušajte ne uhvatiti i zanemariti iznimke. Kako bi se riješili neugodnosti provjerenih izuzetaka, puno će novajlije i lijenih programera postaviti blok hvatanja, ali ostaviti ga praznim. Loše! Uvijek postupajte graciozno, ali ako ne možete, u najmanju ruku ispišite trag snopa, tako da znate da je iznimka bačena. To možete učiniti pomoću gumba Exception.printStackTrace () način.
  • Pazite na pretjerane iznimke. Kad imate čekić, sve izgleda poput čavala. Kad prvi put saznate za iznimke, možda ćete se osjećati obaveznima sve pretvoriti u iznimku ... do točke kada se veći dio kontrolnog toka vaše aplikacije svodi na postupanje s iznimkama. Zapamtite, iznimke su namijenjene “izuzetan” pojave!

Sada bi vam trebalo biti dovoljno ugodno s iznimkama da biste razumjeli što su oni, zašto se koriste i kako ih uključiti u svoj kod. Ako ne razumijete potpuno koncept, to je u redu! Trebalo mi je neko vrijeme da to učinim “klik” u mojoj glavi, tako da ne osjećate kao da ga trebate žuriti. 6 Znakova da ne biste trebali biti programer 6 Znakovi da ne želite biti programer Nisu svi odlučeni da budu programeri. Ako niste sasvim sigurni da ste namijenjeni programeru, evo nekoliko znakova koji vas mogu usmjeriti u pravom smjeru. , Uzmi si vremena.

Imate li kakvih pitanja? Znate li za neke druge savjete vezane uz iznimke koji su mi nedostajali? Podijelite ih u komentarima ispod!




Još ne komentari

O modernoj tehnologiji, jednostavnoj i pristupačnoj.
Vaš vodič u svijetu moderne tehnologije. Naučite kako koristiti tehnologije i uređaje koji nas okružuju svaki dan i naučite kako otkriti zanimljivosti na Internetu.