Kako se na pravi način nositi s Java iznimkama

Kako se na pravi način nositi s Java iznimkama

Kao početnik u programiranju, koncept rukovanje iznimkama može biti teško omotati glavu. Nije da je sam koncept težak, ali terminologija ga može učiniti naprednijim nego što jest. I to je toliko 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 modernih jezika ima neku vrstu obrade iznimki, pa ako ikada prijeđete s Jave, većinu ovih savjeta možete ponijeti sa sobom.





Razumijevanje Java iznimki

Na Javi, an iznimka je objekt koji ukazuje na to da se nešto neobično (ili 'iznimno') dogodilo tijekom izvođenja vaše aplikacije. Takve iznimke su bačen , što u osnovi znači da je stvoren objekt iznimke (slično načinu na koji se greške 'podižu').





Ljepota je što možeš ulov bacili iznimke, što vam omogućuje da se nosite s abnormalnim stanjem i dopustite da se vaša aplikacija nastavi izvoditi kao da ništa nije pošlo po zlu. Na primjer, dok bi nulti pokazivač u jeziku C mogao srušiti vašu aplikaciju, Java vam omogućuje bacanje i hvatanje

NullPointerException

s prije nego što null varijabla ima priliku uzrokovati rušenje.



Upamtite, iznimka je samo objekt, ali s jednom važnom karakteristikom: mora se proširiti od

Exception

klase ili bilo koje podklase





Exception

. Iako Java ima sve vrste ugrađenih iznimaka, po želji možete stvoriti i vlastite. Neki od najčešće Java iznimke uključuju:

  • NullPointerException
  • NumberFormatException
  • IllegalArgumentException
  • RuntimeException
  • IllegalStateException

Dakle, što se događa kada napravite iznimku?





Prvo, Java traži unutar neposredne metode da vidi postoji li kod koji obrađuje vrstu iznimke koju ste unijeli. Ako rukovatelj ne postoji, on pregledava metodu koja je pozvala trenutnu metodu da vidi postoji li tamo ručka. Ako nije, gleda se metoda koja je pozvala da metoda, a zatim sljedeća metoda itd. Ako iznimka nije uhvaćena, aplikacija ispisuje trag steka, a zatim se ruši. (Zapravo je više nijansirano od pukog rušenja, ali to je napredna tema izvan opsega ovog članka.)

DO trag steka je popis svih metoda koje je Java prošla tražeći rukovatelj iznimki. Evo kako izgleda trag steka:

Exception in thread 'main' java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Iz ovoga možemo puno izvući. Prvo, bačena iznimka bila je a

NullPointerException

. To se dogodilo u

getTitle()

metoda u retku 16 knjige.java. Ta je metoda pozvana iz

getBookTitles()

na retku 25 autora.java. Da metoda je pozvana iz

main()

na retku 14 Bootstrap.java. Kao što vidite, poznavanje svega ovoga olakšava ispravljanje pogrešaka.

No, opet, prava korist iznimki je ta što se možete 'nositi' s nenormalnim stanjem hvatajući iznimku, popravljajući stvari i nastavljajući aplikaciju bez rušenja.

Korištenje Java iznimki u kodu

Recimo da imate

someMethod()

koji uzima cijeli broj i izvršava logiku koja bi se mogla slomiti ako je cijeli broj manji od 0 ili veći od 100. Ovo bi moglo biti dobro mjesto za bacanje iznimke:

kôd pogreške disney centra za pomoć 83
public void someMethod(int value) {
if (value 100) {
throw new
IllegalArgumentException

Da biste uhvatili ovu iznimku, morate otići kamo

someMethod()

se naziva i koristi try-catch blok :

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
}
// ...
}

Sve unutar probati block će se izvršavati redom sve dok se ne pojavi iznimka. Čim se izuzme iznimka, svi naredni izrazi se preskaču i logika aplikacije odmah preskače na ulov blok.

U našem primjeru ulazimo u try 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šavanje

someMethod()

, preskače ostatak logike u bloku try (

someOtherMethod()

se nikad ne poziva) i nastavlja izvršavanje unutar bloka catch.

Što bi se dogodilo da nazovemo

someMethod(50)

umjesto toga? The

IllegalArgumentException

nikad ne bi bila bačena.

someMethod()

izvršilo bi se normalno. Blok try će se izvesti kao i obično, pozivajući

someOtherMethod()

kada 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 bloku pokušaja:

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
} catch (NullPointerException e) {
// handle the exception in here
}
// ...
}

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

public void method() {
try {
// ...
} catch (Exception e) {
// ...
} finally {
// ...
}
}

Kod unutar konačno bloka je stalno izvršen bez obzira na sve. Ako imate naredbu return u bloku try, konačni blok se izvršava prije povratka iz metode. Ako ubacite još jednu iznimku u blok catch, konačni se blok izvršava prije nego što se iznimka baci.

Konačno blokiranje trebali biste koristiti kada imate objekte koje je potrebno očistiti prije završetka metode. Na primjer, ako ste otvorili datoteku u bloku try i kasnije bacili iznimku, na kraju blok vam omogućuje da zatvorite datoteku prije napuštanja metode.

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

public void method() {
try {
// ...
} finally {
// ...
}
}

To vam omogućuje da izvršite bilo kakvo potrebno čišćenje, a dopuštajući izbačenim iznimkama da prošire hrpu doziva metode (tj. Ne želite rukovati iznimkom ovdje, ali ipak morate prvo očistiti).

Provjereno u odnosu na neprovjerene iznimke u Javi

Za razliku od većine jezika, Java razlikuje provjerene iznimke i neprovjerene iznimke (npr. C# ima samo neprovjerene iznimke). Provjerena iznimka mora biti uhvaćen u metodi gdje je izbačena iznimka ili se kôd neće kompilirati.

Da biste stvorili označenu iznimku, proširite od

Exception

. Da biste stvorili neoznačenu iznimku, proširite od

RuntimeException

.

Svaka metoda koja baci provjerenu iznimku mora to označiti u potpisu metode pomoću baca ključna riječ. Budući da je Java ugrađena

IOException

je označena iznimka, sljedeći se kod neće prevesti:

public void wontCompile() {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

Prvo morate izjaviti da baca označenu iznimku:

public void willCompile() throws IOException {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

Imajte na umu da se metoda može deklarirati kao bacanje iznimke, ali nikada zapravo ne baca iznimku. Čak i u tom slučaju iznimka će se ipak morati uloviti ili se kôd neće kompilirati.

Kada biste trebali koristiti provjerene ili neprovjerene iznimke?

Službena Java dokumentacija ima stranicu na ovo pitanje . Razlikuje sažeto pravilo: „Ako se razumno može očekivati ​​da će se klijent oporaviti od iznimke, učinite to provjerenom iznimkom. Ako klijent ne može učiniti ništa kako bi se oporavio od iznimke, učinite je nekontroliranom iznimkom. '

Ali ova smjernica može biti zastarjela. S jedne strane, provjerene iznimke dovode do robusnijeg koda. S druge strane, nijedan drugi jezik nije provjerio iznimke na isti način kao Java, što pokazuje dvije stvari: prvo, značajka nije dovoljno korisna da bi je drugi jezici mogli ukrasti, i drugo, apsolutno možete živjeti bez njih. Osim toga, označene iznimke ne igraju se dobro s lambda izrazima uvedenim u Javi 8.

Smjernice za upotrebu Java iznimki

Izuzeci su korisni, ali se lako zloupotrebljavaju i zloupotrebljavaju. Evo nekoliko savjeta i najboljih postupaka koji će vam pomoći da izbjegnete nered.

  • Radije dajte posebne iznimke općim iznimkama. Upotrijebite | _+_ | preko | _+_ | ako je moguće, u suprotnom koristite | _+_ | preko | _+_ | kad je to moguće.
  • Nikad ne hvataj | _+_ | ! | _+_ | klasa zapravo proširuje | _+_ | , a blok catch zapravo radi s | _+_ | ili bilo koju klasu koja proširuje Throwable. Međutim, | _+_ | klasa također proširuje | _+_ | , i nikad ne želite uloviti | _+_ | jer | _+_ | s ukazuju na ozbiljna nepopravljiva pitanja.
  • Nikad ne hvataj | _+_ | ! | _+_ | produžava | _+_ | , dakle svaki blok koji hvata | _+_ | također će uhvatiti | _+_ | , a to je vrlo važna iznimka s kojom se ne želite petljati (osobito u aplikacijama s više niti) ako ne znate što radite. Ako ne znate koju iznimku umjesto toga uhvatiti, razmislite o tome da ništa ne ulovite.
  • Za lakše otklanjanje pogrešaka koristite opisne poruke. Kada izuzmete iznimku, možete navesti | _+_ | poruka kao argument. Ovoj se poruci može pristupiti u bloku catch pomoću | _+_ | metodu, ali ako se iznimka nikad ne uhvati, poruka će se također pojaviti kao dio praćenja steka.
  • Pokušajte ne hvatati i zanemariti iznimke. Kako bi zaobišli neugodnosti provjerenih iznimaka, mnogi početnici i lijeni programeri postavit će blok catch, ali ga ostaviti praznim. Loše! Uvijek s tim postupajte graciozno, ali ako ne možete, ispišite barem trag hrpe kako biste znali da je izuzetak izbačen. To možete učiniti pomoću | _+_ | metoda.
  • Čuvajte se prekomjerne uporabe iznimki. Kad imate čekić, sve izgleda kao čavao. Kad prvi put saznate o iznimkama, možda ćete se osjećati dužnima sve pretvoriti u iznimku ... do točke u kojoj se većina kontrolnog toka vaše aplikacije svodi na rukovanje iznimkama. Upamtite, iznimke su namijenjene 'iznimnim' pojavama!

Sada biste trebali biti dovoljno upoznati s iznimkama da razumijete što su, zašto se koriste i kako ih ugraditi u svoj kôd. Ako ne razumijete u potpunosti koncept, u ​​redu je! Trebalo mi je neko vrijeme da mi 'klikne' u glavi, pa nemojte imati osjećaj da morate žuriti. Ne žurite.

Imate li pitanja? Znate li za neke druge savjete vezane uz iznimke koje sam propustio? Podijelite ih u komentarima ispod!

Udio Udio Cvrkut E -pošta Kako izraditi dijagram protoka podataka za vizualizaciju podataka bilo kojeg projekta

Dijagrami protoka podataka (DFD) bilo kojeg procesa pomažu vam da razumijete kako podaci teku od izvora do odredišta. Evo kako ga stvoriti!

Pročitajte Dalje
Povezane teme
  • Programiranje
  • Java
O autoru Joel lee(1524 objavljenih članaka)

Joel Lee glavni je urednik MakeUseOf -a od 2018. Ima B.S. iz računalnih znanosti i više od devet godina profesionalnog iskustva u pisanju i uređivanju.

igre na kojima možete pisati tekst
Više od Joela Leeja

Pretplatite se na naše obavijesti

Pridružite se našem biltenu za tehničke savjete, recenzije, besplatne e -knjige i ekskluzivne ponude!

Kliknite ovdje za pretplatu