Oglas
Kao početnik u programiranju Kako naučiti programiranje bez ikakvog stresaMožda ste se odlučili baviti programiranjem, bilo radi karijere 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. Čitaj više , 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 zloupotrebi i zlouporabi.
U ovom ćete članku naučiti što su iznimke, zašto su važne, kako se koristiti i česte pogreške koje treba izbjegavati. Većina modernih jezika 6 najlakših jezika za programiranje za učenje za početnikeNaučiti programirati znači pronalaženje pravog jezika jednako koliko i postupak edifikacije. Slijedi prvih šest najlakših programskih jezika za početnike. Čitaj više imati nekakve postupke s iznimkama, pa ako hoćete ikad prijeći s Jave 7 korisnih trikova za savladavanje novog programskog jezikaU redu je biti preopterećen kada učite kodirati. Vjerojatno ćete stvari zaboraviti čim ih naučite. Ovi savjeti mogu vam pomoći da bolje zadržite sve te nove informacije. Čitaj više , većinu ovih savjeta možete ponijeti sa sobom.
Razumijevanje Java izuzetaka
U Javi, an izuzetak je objekt koji označava da se tijekom pokretanja vaše aplikacije dogodilo nešto nenormalno (ili „iznimno“). Takvi su izuzeci bačen, što u osnovi znači da se stvara izuzetak (slično načinu na koji se pogreške podižu).
Ljepota je u tome što možete ulov izuzeti izuzeci, š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 NullPointerException
s prije nego što je null varijabla imati 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. Neki od najčešći izuzeci Java uključuju:
NullPointerException
NumberFormatException
IllegalArgumentException
RuntimeException
IllegalStateException
Pa što se događa kad baciš 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 ručka. Ako ne, pregledava metodu koja je pozvala da metoda, a zatim slijedeća metoda itd. Ako se iznimka ne uhvati, aplikacija ispisuje trag snopa, a 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 kojima je Java prešao dok je tražio izuzetak. 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.
No opet, istinska korist izuzetaka je ta što možete obraditi abnormalno stanje tako što ćete uhvatiti iznimku, ispraviti stvari i nastaviti program bez rušenja.
Korištenje Java iznimki u kodu
Recimo da imate someMethod ()
koja 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. Ovo bi moglo biti dobro mjesto za izuzeće:
javna void someMethod (vrijednost int) {if (vrijednost <0 || vrijednost> 100) {baciti novo IllegalArgumentException
(); } //... }
Da biste uhvatili ovu iznimku, morate ići kamo someMethod ()
zove se i koristi pokušaj-ulov 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 unosimo pokusni 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šavanje unutar bloka hvatanja.
Što bi se dogodilo da nazovemo neki Metod (50)
umjesto toga? IllegalArgumentException
nikad se ne bi bacili. someMethod ()
pogubio 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 obrađuje iznimku} catch (NullPointerException e) {// ovdje obrađuje iznimku} //... }
Također imajte na umu da izborno konačno i blok postoji:
javna nevažeća metoda () {pokušaj {//... } hvatanje (iznimka e) {//... } napokon {//... } }
Kod unutar konačno blokiranog je stalno pogubljen bez obzira na sve. Ako imate povratnu izjavu u pokušaju, zadnji 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 i kasnije izbacili iznimku, konačni blok omogućuje vam zatvaranje datoteke 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šta da izuzeti izuzeci šire svoj postupak stavak poziva (tj. ovdje ne želite obraditi iznimku, ali svejedno morate očistiti prvi).
Provjereno vs. Neprovjerene iznimke u 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 metodu u kojoj se baca izuzetak ili se inače kod ne sastavlja.
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. Budući da je Java ugrađena IOException
je označena iznimka, sljedeći se kôd neće sastaviti:
javna void wontCompile () {//... ako (someCondition) {bacite novu IOException (); } //... }
Prvo morate izjaviti da baca provjereni izuzetak:
javna void willCompile () baca IOException {//... ako (someCondition) {bacite novu IOException (); } //... }
Imajte na umu da se metoda može proglasiti izbacivanjem iznimke, ali nikada izuzev. Uprkos tome, iznimka će se i dalje morati uhvatiti ili se inače neće kôd sastaviti.
Kada treba koristiti provjerene ili neprovjerene iznimke?
Službena Java dokumentacija sadrži a stranice o ovom pitanju. Razliku rezimira sa sažetim pravilom: "Ako se može opravdano očekivati da se klijent može oporaviti od iznimke, napravi to provjerenog izuzeća. Ako klijent ne može učiniti ništa kako bi se oporavio od iznimke, učini to neprovjerenom iznimkom. "
Ali ova smjernica može biti zastarjela. S jedne strane provjereni izuzeci rezultiraju snažnijim kodom 10 savjeta za pisanje čistije i bolji kodPisanje čistog koda izgleda lakše nego što zapravo jest, ali koristi su vrijedne toga. Evo kako danas možete početi pisati čistiji kod. Čitaj više . S druge strane, niti jedan drugi jezik nije provjerio iznimke na isti način kao Java, što pokazuje dvije stvari: prvo, ova značajka nije dovoljno korisna da je drugi jezici ukradu, a dva, bez kojih možete apsolutno živjeti ih. Osim toga, provjerene iznimke ne igraju se lijepo s lambda izrazima uvedenima u Javi 8.
Smjernice za upotrebu iznimki u Javi
Izuzeci su korisni, ali ih se lako i zloupotrijebi. Evo nekoliko savjeta i najboljih iskustava koji će vam pomoći da ne budete pravi nered.
-
Preferirajte određene iznimke od općih iznimki. Koristiti
NumberFormatException
nadIllegalArgumentException
ako je moguće, u protivnom upotrijebiteIllegalArgumentException
nadRuntimeException
kad je to moguće. -
Nikad ne uhvatite
Za odbaciti
!izuzetak
klasa se zapravo proširujeZa odbaciti
, a blok hvata zapravo radi saZa odbaciti
ili bilo koju klasu koja se proteže za Throwable. Međutimgreška
klasa se također proširujeZa odbaciti
, i nikad ga ne želite uhvatitigreška
jergreška
s ukazuju na ozbiljna nerešiva pitanja. -
Nikad ne uhvatite
izuzetak
!InterruptedException
proteže seizuzetak
, pa bilo koji blok koji uhvatiizuzetak
također će uhvatitiInterruptedException
, a to je vrlo važna iznimka s kojom se ne želite miješati (posebno u aplikacijama s više niti), 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 bacite iznimku, možete unijeti
Niz
poruka kao argument. Ovoj se poruci može pristupiti u bloku hvata pomoću gumbaException.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 zaobišli 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, barem ispisujte trag snopa, tako da znate da je iznimka bačena. To možete učiniti pomoću gumba
Exception.printStackTrace ()
metoda. - Pazite prekomjerne iznimke. Kad imate čekić, sve izgleda poput čavala. Kad prvi put saznate o iznimkama, možda ćete se osjećati obaveznima sve pretvoriti u iznimku... do točke kada se najveći dio kontrolnog toka vaše aplikacije svodi na postupanje s iznimkama. Zapamtite, iznimke su namijenjene "iznimnim" događajima!
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 taj koncept, to je u redu! Trebalo mi je neko vrijeme da mi je "kliknuo" u glavu, pa ne osjećaš kao da trebaš brzati 6 Znakovi da ne treba biti programerNisu svi sigurni da su programeri. Ako niste sasvim sigurni da ste namijenjeni programeru, evo nekoliko znakova koji vas mogu usmjeriti u pravom smjeru. Čitaj više . Uzmi si vremena.
Imate li kakvih pitanja? Znate li za neke druge savjete vezane uz iznimke koje sam propustio? Podijelite ih u komentarima ispod!
Joel Lee ima B.S. u računalnim znanostima i preko šest godina profesionalnog pisanja. Glavni je urednik MakeUseOf-a.