Uobičajene Java iznimke

1. Uvod

Ovaj se vodič usredotočuje na neke uobičajene Java iznimke.

Započet ćemo raspravom o tome što je u osnovi iznimka. Kasnije ćemo detaljno razgovarati o različitim vrstama provjerenih i neprovjerenih iznimaka.

2. Iznimke

Iznimka su abnormalna stanja koja se javljaju u slijedu koda tijekom izvršavanja programa. Ovo abnormalno stanje nastaje kada program krši određena ograničenja tijekom izvođenja.

Sve vrste izuzetaka potklase su klase Iznimka. Zatim se ova klasa potklasira u provjerene iznimke i neprovjerene iznimke. Detaljno ćemo ih razmotriti u sljedećim odjeljcima.

3. Označene iznimke

Označene iznimke obvezne su za rukovanje. Oni su izravna potklasa klase Iznimka.

Postoji rasprava o njihovoj važnosti koju vrijedi pogledati.

Detaljno definirajmo neke provjerene iznimke.

3.1. IOException

Metoda baca IOException ili njegov izravni podrazred kada bilo koja operacija ulaza / izlaza ne uspije.

Tipične upotrebe ovih I / O operacija uključuju:

  • Rad s datotečnim sustavom ili tokovima podataka pomoću java.io paket
  • Izrada mrežnih aplikacija pomoću java.net paket

FileNotFoundException

FileNotFoundException je uobičajena vrsta IOException tijekom rada s datotečnim sustavom:

isprobajte {novi FileReader (nova datoteka ("/ nevaljana / datoteka / mjesto")); } catch (FileNotFoundException e) {LOGGER.info ("FileNotFoundException uhvaćen!"); }

MalformedURLException

Kada radimo s URL-ovima, mogli bismo se susresti s MalformedURLException - ako su naši URL-ovi nevaljani.

isprobajte {novi URL ("malformedurl"); } catch (MalformedURLException e) {LOGGER.error ("MalformedURLException uhvaćen!"); }

3.2. ParseException

Java koristi raščlanjivanje teksta za stvaranje objekta na temelju zadanog Niz.Ako raščlanjivanje uzrokuje pogrešku, izbacuje a ParseException.

Na primjer, mogli bismo predstavljati Datum na različite načine na pr. dd / mm / gggg ili dd, mm, gggg, ali pokušajte raščlaniti a niz s drugim formatom:

isprobajte {novi SimpleDateFormat ("MM, dd, gggg"). parse ("invalid-date"); } catch (ParseException e) {LOGGER.error ("ParseException uhvaćen!"); }

Evo, Niz je nepravilno oblikovan i uzrokuje a ParseException.

3.3. InterruptedException

Kad god Java nit pozove join (), spavanje () ili čekati() ide u bilo ČEKANJE država ili VRIJEME_ČEKANJE država.

Osim toga, nit može prekinuti drugu nit pozivanjem druge niti prekinuti() metoda.

Slijedom toga, the nit baca an InterruptedException ako ga druga nit prekine dok je u ČEKANJE ili u VRIJEME_ČEKANJE država.

Razmotrite sljedeći primjer s dvije niti:

  • Glavna nit pokreće podređenu nit i prekida je
  • Podređena nit pokreće se i poziva spavati()

Ovaj scenarij rezultira InterruptedException:

klasa ChildThread proširuje Thread {public void run () {try {Thread.sleep (1000); } catch (InterruptedException e) {LOGGER.error ("InterruptedException uhvaćen!"); }}} javna klasa MainThread {javna statička void main (String [] args) baca InterruptedException {ChildThread childThread = new ChildThread (); childThread.start (); childThread.interrupt (); }}

4. Neoznačene iznimke

Za neprovjerene iznimke, kompajler ne provjerava tijekom postupka kompilacije. Stoga nije obvezno da metoda obrađuje ove iznimke.

Sve neprovjerene iznimke proširuju klasu RuntimeException.

Razmotrimo detaljno neke neprovjerene iznimke.

4.1. NullPointerException

Ako neka aplikacija pokuša koristiti null tamo gdje zapravo zahtijeva instancu objekta, metoda će baciti a NullPointerException.

Postoje različiti scenariji kada ilegalna uporaba null uzroci NullPointerException. Razmotrimo neke od njih.

Pozivanje metode klase koja nema instancu objekta:

Niz strObj = null; strObj.equals ("Pozdrav svijetu"); // baca NullPointerException.

Također, ako aplikacija pokušava pristupiti ili izmijeniti varijablu instance pomoću null referenca, dobivamo a NullPointerException:

Osoba personObj = null; Ime niza = personObj.personName; // Pristup polju nultog objekta personObj.personName = "Jon Doe"; // Izmjena polja nultog objekta

4.2. ArrayIndexOutOfBoundsException

Niz pohranjuje svoje elemente na kontinuirani način. Tako njegovim elementima možemo pristupiti putem indeksa.

Međutim, ako dio koda pokuša pristupiti ilegalnom indeksu niza, odgovarajuća metoda baca ArrayIndexOutOfBoundException.

Pogledajmo nekoliko primjera koji bacaju ArrayIndexOutOfBoundException:

int [] nums = novo int [] {1, 2, 3}; int numFromNegativeIndex = brojevi [-1]; // Pokušaj pristupa s negativnim indeksom int numFromGreaterIndex = nums [4]; // Pokušaj pristupa s većim indeksom int numFromLengthIndex = nums [3]; // Pokušaj pristupa s indeksom jednakim veličini polja

4.3. StringIndexOutOfBoundsException

The Niz klasa u Javi pruža metode za pristup određenom znaku niza ili za izrezivanje niza znakova iz Niz. Kada koristimo ove metode, interno pretvara Niz u niz znakova.

Opet, moglo bi doći do ilegalne upotrebe indeksa na ovom nizu. U takvim slučajevima, ove metode Niz razred baca StringIndexOutOfBoundsException.

Ova iznimka označava da je indeks veći ili jednak veličini Niz.StringIndexOutOfBoundsException proteže se IndexOutOfBoundsException.

Metoda charAt (indeks) razreda Niz baca ovu iznimku kada pokušavamo pristupiti znaku u indeksu jednakom Gudački dužina ili neki drugi ilegalni indeks:

String str = "Pozdrav svijetu"; char charAtNegativeIndex = str.charAt (-1); // Pokušaj pristupa s negativnim indeksom char charAtLengthIndex = str.charAt (11); // Pokušaj pristupa s indeksom jednakim veličini niza 

4.4. NumberFormatException

Često aplikacija završi s numeričkim podacima u a Niz. Kako bi ove podatke protumačio kao numeričke, Java omogućuje pretvorbu Niz na numeričke tipove. Klase omota kao što su Integer, Float itd. sadrži korisne metode u tu svrhu.

Međutim, ako je Niz nema odgovarajući format tijekom pretvorbe, metoda baca a NumberFormatException.

Razmotrimo sljedeći isječak.

Ovdje proglašavamo a Niz s alfanumeričkim podacima. Nadalje, pokušavamo koristiti metode Cijeli broj klasa omota za tumačenje ovih podataka kao numeričkih.

Slijedom toga, to rezultira NumberFormatException:

Niz str = "100ABCD"; int x = Integer.parseInt (str); // Baca NumberFormatException int y = Integer.valueOf (str); // Baca NumberFormatException

4.5. ArithmeticException

Kada program procijeni aritmetičku operaciju i rezultira nekim iznimnim stanjem, baca ArithmeticException. U Dodatku, ArithmeticException odnosi se samo na int i dugo vrste podataka.

Na primjer, ako cijeli broj pokušamo podijeliti s nulom, dobit ćemo ArithmeticException:

int nezakonito = 30/0; // Baca ArithmeticException

4.6. ClassCastException

Java omogućuje slanje tipova između objekata kako bi podržao nasljeđivanje i polimorfizam. Možemo ili unaprijediti objekt ili ga spustiti.

Tijekom nadogradnje, bacili smo objekt na njegov supertip. I u silovanju, bacili smo objekt na jednu od njegovih podvrsta.

Međutim, u vrijeme izvođenja, ako kod pokušava oboriti objekt na podtip čiji on nije instanca, metoda baca ClassCastException.

Runtime instanca je ono što je zapravo važno kod slanja tipova. Razmotrite sljedeće nasljeđivanje između Životinja, Pas i Lav:

razred Animal {} class Dog produžuje Animal {} class Lion produžuje Animal {} 

Dalje, u klasi vozača izbacili smo Životinja referenca koja sadrži primjerak Lav u a Pas.

Međutim, u vrijeme izvođenja JVM primjećuje tu instancu Lav nije kompatibilan s podtipom klase Pas.

To rezultira ClassCastException:

Životinjska životinja = novi Lav (); // Za vrijeme izvođenja instanca je Lion Dog tommy = (Pas) životinja; // Baca ClassCastException

4.7. IlegalArgumentException

Metoda baca IlegalArgumentException ako to nazovemo nekim nezakonitim ili neprimjerenim argumentima.

Na primjer, spavati() metoda Nit razred očekuje pozitivno vrijeme, a negativni vremenski interval prolazimo kao argument. To rezultira IlegalArgumentException:

Thread.currentThread (). Sleep (-10000); // Baca IllegalArgumentException

4.8. IllegalStateException

IllegalStateException signalizira da se metoda pozivala u ilegalno ili neprikladno vrijeme.

Svaki Java objekt ima stanje (varijable instance) i neko ponašanje (metode). Tako, IllegalStateException znači da je nezakonito pozivanje na ponašanje ovog objekta s varijablama trenutnog stanja.

Međutim, s nekim različitim varijablama stanja, to bi moglo biti legalno.

Na primjer, koristimo iterator za ponavljanje popisa. Kad god inicijaliziramo jedan, on interno postavlja svoju varijablu stanja lastRet do -1.

S tim kontekstom, program pokušava nazvati ukloniti metoda na popisu:

// Inicijalizirano indeksom na -1 Iterator intListIterator = new ArrayList (). Iterator (); intListIterator.remove (); // IllegalStateException 

Interno, ukloniti metoda provjerava varijablu stanja lastRet a ako je manje od 0, baca IllegalStateException. Ovdje varijabla i dalje pokazuje vrijednost -1.

Kao rezultat, dobivamo IllegalStateException.

5. Zaključak

U ovom smo članku prvo razgovarali o iznimkama. An iznimka je događaj koji se događa tijekom izvršavanja programa koji remeti normalan tijek uputa programa.

Zatim smo iznimke kategorizirali u Označene iznimke i Neprovjerene iznimke.

Dalje, razgovarali smo o različitim vrstama iznimaka koji se mogu pojaviti tijekom vremena kompajliranja ili tijekom izvođenja.

Kôd za ovaj članak možemo pronaći na GitHubu.