Izuzeci Java Slažete li se s njima dobro?

  • Brian Curtis
  • 0
  • 1143
  • 2
Oglas

Izuzetak u programiranju označava iznimno stanje u nekom trenutku izvođenja programa. Koristi se kad 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 kodova, možda korištenjem alternativnog mjesta konfiguracijske datoteke.
  • Pristup stavci matrice Kako se koristi Java ArrayList Kako koristiti Java ArrayList Java Arraylist Java je matrica za općenitu namjenu veličine. 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. 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 dostupne java procesu.

U svim tim slučajevima (i više), iznimku treba rješavati izvan mjesta na kojem se stvara, tako da se temeljni uzrok može riješiti.

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ška, S 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.

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 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.

private 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));  hvatanje (FileNotFoundException ex) // ovdje obrada iznimke 

Ako izuzetak ne može izravno obraditi pozivatelj, to se mora navesti u potpisu metode.

privatna void loadFile (String file file) baca java.io.FileNotFoundException FileReader u = novi FileReader (naziv datoteke));  

Neprovjerene iznimke

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

private void handleEvent () 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 ispravno sastavio, izuzeće se mora proglasiti za bacanje.

private void method_1 () baca SQLException … bacanje nove 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 ();  hvatati (java.sql.SQLException ex) baciti novi 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 koji su uzrokovali pogrešku Java Izuzeci: Dobro se ponašate s njima? 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 rješavati negdje drugdje. Razmotrimo slijedeće primjere upravljanja Java iznimkama. .

Ovdje je tipičan trag snopa, dobiven od objekta iznimke kada 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:129) at 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 generirati ulov IOException (java.io.IOException ex) // ovdje izuzetak. Može se prijaviti u datoteku dnevnika. log.warning (ex.getMessage ());  

Kad se iznimka zamota unutar druge, možete dohvatiti zamotani 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 ()). dodaj ("\ n");  log.warning (sbuf.toString ()); 

Ili možda zabilježite iznimku i ponovno je ubacite?

pokušajte … uhvatiti (java.io.IOException ex) log.warning (ex.getMessage ()); baciti ex;  

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

pokušajte … uhvatiti (java.io.IOException ex) PrintStream out =…; out.println (ex.getMessage ()); ex.printStackTrace (od);  

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

pokušajte // ovdje baciti neke iznimke uhvatiti (java.io.IOException ex) // ovdje specifično rukovanje IOException uhvatiti (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 izbaciti neke iznimke uhvatiti (java.io.IOException | java.sql.SQLException ex) // ovdje specifično rukovanje IOException i SQLException uhvatiti (SAXException ex) // SAXException posebno rukovanje ovdje 

Čišćenje resursa napokon

Kada se bavite kodom koji može izbaciti iznimke, važno je pravilno izvršiti čišćenje svih resursa, poput otvorenih datoteka. Sve što trebate znati o formatima datoteka i njihovim svojstvima Sve što trebate znati o formatima datoteka i njihovim svojstvima. Koristimo riječ datoteka izmjenjiva: glazba, slika, proračunska tablica, prezentacija itd. Ali što datoteku uopće čini "datotekom"? Pokušajmo razumjeti ovaj temeljni dio računanja. , veze baze podataka, itd. Čišćenje resursa trebalo bi biti provedeno u konačno blok. Na ovaj način, i uobičajeni i izvanredni izlazak iz bloka pozivaju se na program čišćenja. 10 najgorih grešaka u programiranju u povijesti 10 najgorih grešaka u programiranju u povijesti U prošloj povijesti, kodiranje uništeno je također. Primjeri malo lošeg koda uzrokovali su katastrofu na velikoj razini. Slijedi 10 najgorih programskih pogrešaka u povijesti. .

InputStream u = null; pokušajte … in = novi FileInputStream (naziv datoteke);… uhvatiti (java.io.IOException ex) log.warning (ex.getMessage ());  konačno // kod se ovdje izvršava pri izlasku iz bloka pokušaja, // 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 in = new FileInputStream (…); Connection con =…;) // kod 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() način.

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 izuzeće koje se često susreću.

  • IndexOutOfBoundsException (neoznačeno): pokazuje da je indeks pristupa kojem se elementu nalazi 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 upotreba izuzetaka poboljšava kvalitetu pisanja ili bržeg koda u vašem uređivaču teksta teksta s prilagođenim temama Pisanje ili bržeg koda u vašem Linux uređivaču teksta s prilagođenim temama Vaš Linux uređivač teksta ne mora izgledati crno i "funkcionalno". Zašto ga ne biste prilagodili radi poboljšanja produktivnosti, bilo da je to skript i kodiranje ili alat koristite kao uređivač oznaka? i pomoć u rješavanju problema u proizvodnji.

Imate li kakve 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




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.