Oglas

Izuzetak u programiranju označava iznimno stanje u nekom trenutku izvršenja programa. Koristi se kada se izvanredni uvjeti mogu rješavati negdje drugdje, a ne gdje se susreće. Razmotrite sljedeće primjere:

  • Neuspjeh u otvaranju konfiguracijske datoteke može se bolje riješiti većim brojem koda, možda korištenjem alternativne lokacije konfiguracijske datoteke.
  • Pristup an stavka matrice Kako se koristi Java ArrayListJava arrayist je niz za opću namjenu koji može promijeniti veličinu. Pruža većinu objekata koji se obično očekuju od nizova na drugim jezicima. U ovom ćete članku naučiti kako postaviti i koristiti polje. Čitaj više izvan granica polja označava programsku pogrešku. Sretno otklanjanje pogrešaka!
  • Pogreška pri raščlanjivanju XML-a treba biti upozorena korisniku kako bi se XML datoteka mogla ispraviti.
  • Program koji ponestaje memorije (možda pri obradi velike datoteke) može se ispraviti možda povećanjem količine memorije koja je dostupna u java procesu.

U svim tim slučajevima (i više), iznimku treba rješavati izvan mjesta na kojem se stvara kako bi se mogao otkloniti osnovni uzrok.

Vrste izuzetaka

Slika ispod prikazuje glavne dijelove Java hijerarhije izuzetaka. Osnovna klasa je Za odbaciti u koji se podrazumijeva izuzetak i greška. klasa izuzetak je za uvjete povezane s programom koje aplikacije mogu uhvatiti u pokušaju da spasu situaciju. klasa greškaS druge strane, znači ukazivanje na ozbiljne pogreške u Java Run-time okruženju koje aplikacije ne bi trebale zahvatiti. Neki su primjeri: OutOfMemoryError i StackOverflowError.

Hijerarhija izuzetaka

izuzetak opet je dvije vrste: provjereno i neprovjereno. Označena iznimka mora se baviti kodom pozivanja. Ovo pravilo provodi java prevoditelj. S druge strane, nekontrolirana iznimka može se širiti u lanac poziva bez da je izričito izjavljuje. Primjeri u nastavku pojasnit će.

Provjerene iznimke

Sljedeća metoda pokušava se stvoriti FileReader iz datoteke. Konstruktor izbacuje provjerenu iznimku FileNotFoundException koji moraju biti obrađeni pozivni kod ili deklarirani za bacanje.

Sljedeći kod će ne sastaviti jer ne čini nijedno.

privatna void loadFile (Naziv datoteke stringa) {FileReader in = novi FileReader (naziv datoteke); }

Jedan od načina da se kôd sastavi jest obrada iznimke (vidi dolje).

privatna void loadFile (Naziv datoteke stringa) {pokušajte {FileReader in = novi FileReader (naziv datoteke)); {} uhvatiti (FileNotFoundException ex) {// ovdje izuzetak} }

Ako izuzetak ne može izravno postupati s pozivateljem, mora se to objaviti u potpisu metode.

privatna void loadFile (String filename) baca java.io. FileNotFoundException. {FileReader in = novi FileReader (naziv datoteke)); { }

Neprovjerene iznimke

Neprovjerena iznimka je ona od koje se podrazkladira RuntimeException i sa njima se ne treba postupati izravno ili deklarirati kao gore. Na primjer, sljedeći kôd rezultira a NullPointerException, što je vrsta RuntimeException. Kôd, međutim, sastavlja bez pogreške od tada NullPointerException je neprovjerena iznimka.

privatna praznina ručkaEvent () {String name = null; if (ime.length ()> 0) {} }

Zamotavanje izuzetaka

S obzirom na gornju raspravu o provjerenim i neprovjerenim iznimkama, čini se da je lakše nositi se s neprovjerenim iznimkama jer ih ne morate prijavljivati ​​ili ih sami rješavati. Imajući to na umu, ponekad je korisno provjeriti iznimku u neprovjerenu iznimku.

Sljedeći je primjer koda pokazao kako se zavrsiti izuzetak. Metoda method_1 () baca an SQLException u svom tijelu. Da bi se kôd pravilno sastavio, izuzeće se mora proglasiti za bacanje.

private void method_1 () baca SQLException {... baciti novu SQLException; }

Kada se ova metoda poziva iz druge metode (method_2 ()), ta metoda može uhvatiti SQLException i zamotajte ga u neprovjerenu iznimku, tako da ne mora deklarirati iznimku u svom potpisu metode.

private void method_2 () {pokušaj {method_1 (); } uloviti (java.sql. SQLException ex) {baciti novu RuntimeException (ex); } }

Trag stope iznimke

Trag s izuzetkom odnosi se na niz aktivnih okvira snopa, od kojih svaki predstavlja metodu poziva, zabilježenu u JVM-u u trenutku kada je iznimka bačena. Svaki okvir snopa uključuje mjesto poziva metode, uključujući naziv klase, naziv metode i eventualno ime izvorne datoteke Java datoteke i broj retka u datoteci. Korisno je za pronalaženje slijeda poziva što je uzrokovalo pogrešku Izuzeci Java: Odgovarate li s njima dobro?Izuzetak u programiranju označava izniman uvjet u izvršavanju programa. Koristi se kada se stanje može bolje srediti drugdje. Razmotrite sljedeće primjere upravljanja Java iznimkama. Čitaj više .

Ovdje je tipičan trag snopa, dobiven od objekta iznimke kad je uhvaćen.

Izuzetak u temi "glavni" java.lang. IndexOutOfBoundsException: Index: 8, Veličina: 5 na java.util. ArrayList.rangeCheck (ArrayList.java: 653) na java.util. ArrayList.get (ArrayList.java: 429) na sample.sample1.main (sample1.java: 24)

Izuzetak ovdje uhvaćen je IndexOutOfBoundsException. Uključuje dodatne informacije o pogrešci. Trag snopa sadrži 3 okvira snopa, od kojih svaki uključuje podatke o lokaciji kao što je prikazano.

Rukovanje izuzecima

Iznimka se može obraditi tako da je uhvatite u a pokušaj uhvatiti blokiraju i poduzimaju sve potrebne korektivne radnje. izuzetak Objekt pruža nekoliko metoda za vađenje informacija o stanju koje ga je uzrokovalo.

Sljedeći kôd zapisuje poruku o pogrešci u datoteku dnevnika.

privatna void loadConfig () {pokušajte {// pozovite kôd koji može stvoriti IOException} ulov (java.io. IOException ex) {// ovdje izuzetak. Može se prijaviti u datoteku dnevnika. log.warning (ex.getMessage ()); } }

Kad se izuzetak omota unutar drugog, možete dohvaćeni zamoreni izuzetak:

Uzrok bacanja = ex.getCause (); log.warning ("Osnovni uzrok:" + uzrok.getMessage ()); 

Trebate li pristupiti tragu snopa i možda izdvojiti naziv metode koja ga je uzrokovala?

StringBuilder sbuf = new StringBuilder ("Stack Trace:"); for (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). dodavanje ("\ n"); } log.warning (sbuf.toString ());

Ili možda prijavite iznimku i ponovno je bacite?

pokušaj {... } ulov (java.io. IOException ex) {log.warning (ex.getMessage ()); baciti ex; }

izuzetak klasa osigurava a printStackTrace () metoda koja može ispisati trag snopa na svoje PrintStream (ili PrintWriter).

pokušaj {... } ulov (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (out); }

Možete uhvatiti više vrsta izuzetaka u jednom probati blokirati i izvoditi specifična rukovanja za svaku vrstu iznimke.

pokušajte {// ovdje iznijeti neke iznimke. } ulov (java.io. IOException ex) {// IOException specifično rukovanje ovdje. } uloviti (java.sql. SQLException ex) {// SQLException specifično rukovanje ovdje. }

Da biste uhvatili više vrsta izuzetaka, ali koristili isti kod za rukovanje, možete proglasiti a ulov blok s više vrsta na sljedeći način:

pokušajte {// ovdje iznijeti neke iznimke. } ulov (java.io. IOException | java.sql. SQLException ex) {// IOException i SQLException specifično rukovanje ovdje. } hvatanje (SAXException ex) {// SAXException specifično rukovanje ovdje. }

Čišćenje resursa napokon

Kada se bavite kodom koji može izbaciti iznimke, prijeko je potrebno pravilno izvršiti čišćenje svih resursa, poput otvorenih datoteka Sve što trebate znati o formatima datoteka i njihovim svojstvimaDatoteku riječi koristimo naizmjenično: glazbu, sliku, proračunsku tablicu, prezentaciju i tako dalje. Ali što datoteku uopće čini "datotekom"? Pokušajmo razumjeti ovaj temeljni dio računanja. Čitaj više , veze s bazama podataka itd. Čišćenje resursa trebalo bi biti provedeno u konačno blok. Na taj se način i uobičajeni i izvanredni izlaz iz bloka poziva na kod za čišćenje 10 najgorih grešaka u programiranju u povijestiU svojoj povijesnoj prošlosti kodirao je i uništenje od kovanih metala. Primjeri malo lošeg koda uzrokovali su katastrofu na velikoj razini. Slijedi 10 najgorih programskih grešaka u povijesti. Čitaj više .

InputStream u = null; pokušaj {... in = novi FileInputStream (naziv datoteke);... } ulov (java.io. IOException ex) {log.warning (ex.getMessage ()); } konačno {// kod se ovdje izvršava pri izlasku iz probnog bloka, // bilo normalno ili zbog iznimke ako je (in! = null) in.close (); }

Pokušajte s resursima

Java 1.7 je predstavila probati-s-resursima konstrukciju koja olakšava čišćenje resursa. To izgleda ovako:

pokušajte (InputStream u = novom FileInputStream (..)) {// kod koji koristi InputStream. }

Kad kôd izađe iz bloka (bilo čisto ili zbog iznimke), InputStream varijabla se automatski čisti.

Očistite više resursa tako što ćete ih prijaviti u glavi bloka.

pokušajte (InputStream u = novi FileInputStream (..); Priključak con =...; ) {// kôd koji koristi InputStream i Connection. }

Bilo koji objekt čija klasa implementira AutoCloseable sučelje se može očistiti na ovaj način. Sljedeća klasa provodi neko određeno čišćenje u sustavu Zatvoriti() metoda.

MyClass javna klasa implementira Automatsko zatvaranje {public void close () {// ovdje kod za čišćenje) }

Koristite instancu ove klase u a probati-s-resursima blok.

pokušajte (MyClass obj = novi MyClass (..)) {// kod koji koristi MyClass objekt. }

Neke uobičajene susrete s iznimkama

Pogledajmo sada neke iznimke koje se često susreću.

  • IndexOutOfBoundsException (neoznačeno): označava da je indeks pristupa elementu izvan granica niza, niza itd.
  • SQLException (potvrđeno): bačeno zbog pogreške u bazi podataka.
  • IOException (označeno): greška u pristupu datoteci ili pogreške povezane s ulazom i izlazom.
  • InterruptedException (označeno): bačeno kada je prekid izvođenja niti.
  • SAXException (označeno): bačeno zbog pogreške pri raščlanjivanju XML-a.
  • NullPointerException (neoznačeno): koristeći null tamo gdje je objekt potreban.

Završavati

Izuzeci su glavna metoda prijavljivanja i upravljanja pogreškama u Javi. Pravilna uporaba izuzetaka poboljšati kvalitetu koda Brže pisanje ili kodiranje u vašem uređivaču teksta teksta s prilagođenim temamaVaš Linux uređivač teksta ne mora izgledati neuobičajeno i "funkcionalno". Zašto ga ne biste prilagodili radi poboljšanja produktivnosti, bilo da je to skript i kodiranje ili upotreba alata kao uređivača oznaka? Čitaj više i pomoć u rješavanju problema u proizvodnji.

Imate li neke ratne priče vezane uz iznimke? Ako je to slučaj, obratite nam se u odjeljku s komentarima u nastavku.

Kreditna slika: Dmitrij Nikolaev putem Shutterstock.com