Oglas

Izjema pri programiranju pomeni izjemen pogoj v nekem trenutku izvajanja programa. Uporablja se, kadar je izjemne razmere mogoče bolje obvladati drugje, ne pa tam, kjer se srečuje. Upoštevajte naslednje primere:

  • Če konfiguracijske datoteke ne odprete, je mogoče bolje obravnavati višjo kodo, morda z uporabo druge lokacije konfiguracijske datoteke.
  • Dostop do element matrike Kako uporabljati Java ArrayListJava arraylist je niz za spreminjanje velikosti za splošno uporabo. Ponuja večino objektov, ki se običajno pričakujejo od nizov v drugih jezikih. V tem članku se boste naučili nastaviti in uporabljati arraylist. Preberi več zunaj meja matrike pomeni programsko napako. Srečno odpravljanje napak!
  • Uporabnik mora obvestiti napako pri razčlenjevanju XML, da se lahko datoteka XML popravi.
  • Program, ki mu zmanjka pomnilnika (morda pri obdelavi velike datoteke), je mogoče odpraviti tako, da povečate količino pomnilnika, ki je na voljo za postopek java.

V vseh teh primerih (in še več) je treba izjemo obravnavati zunaj lokacije, kjer je ustvarjena, da bi bilo mogoče odpraviti osnovni vzrok.

instagram viewer

Vrste izjem

Spodnja slika prikazuje glavne dele Java Hierarhije izjem. Osnovni razred je Zmogljiv ki je podrazvrščen v Izjema in Napaka. Razred Izjema velja za pogoje, povezane s programom, ki jih aplikacije lahko ujamejo v poskusu reševanja razmer. Razred Napakapo drugi strani je namenjen kazanju resnih napak v izvajalnem okolju Java, ki jih aplikacije ne bi smele zajeti. Nekaj ​​primerov je: OutOfMemoryError in StackOverflowError.

Hierarhija izjem

An Izjema je spet dveh vrst: preverjeno in nepreverjeno. Klicano kodo mora obravnavati preverjena izjema. To pravilo uveljavi prevajalnik java. Po drugi strani se lahko nepreverjena izjema širi po klicni verigi, ne da bi je treba izrecno prijaviti. Spodnji primeri bodo pojasnili.

Preverjene izjeme

Naslednja metoda poskuša ustvariti FileReader iz datoteke. Konstruktor vrže preverjeno izjemo FileNotFoundException ki mora biti obravnavana s klicno kodo ali deklarirana za metanje.

Naslednja koda bo ne prevajati, saj ne stori nobenega.

zasebna void loadFile (Ime datoteke string) {FileReader in = nov FileReader (ime datoteke); }

Eden od načinov za pripravo kode je obdelava izjeme (glej spodaj).

zasebna void loadFile (Ime datoteke string) {poskusite {FileReader in = nov FileReader (ime datoteke)); {} ulov (FileNotFoundException ex) {// tukaj obravnava izjemo} }

Če klicočega izjeme ne more obravnavati neposredno, mora biti navedeno v podpisu metode.

zasebna void loadFile (ime datoteke niza) vrže java.io. FileNotFoundException. {FileReader in = nov FileReader (ime datoteke)); { }

Nenadzorovane izjeme

Nenadzorovana izjema je tista, ki je podrazvrščena RuntimeException in z njimi ni treba ravnati neposredno ali deklarirati kot zgoraj. Na primer, naslednja koda ima za posledico a NullPointerException, ki je vrsta RuntimeException. Koda pa se brez napake sestavi od takrat NullPointerException je nenadzorovana izjema.

zasebni prazninski ročajEvent () {Ime niza = ničelno; if (ime.length ()> 0) {} }

Zavijanje izjem

Glede na zgornjo razpravo o preverjenih in nenadzorovanih izjemah se zdi, da je lažje obravnavati nenadzorovane izjeme, saj vam jih ni treba prijaviti ali z njimi ravnati sami. Če upoštevamo to priročnost, je včasih koristno, da preverjeno izjemo ovijemo v nenadzorovano izjemo.

Naslednji primer kode prikazuje, kako zaviti izjemo. Metoda metoda_1 () vrže an SQLException v svojem telesu. Za pravilno sestavljanje kode je treba razglasiti izjemo, da se vrže.

private void method_1 () vrže SQLException {... vrgel novo SQLException; }

Ko se ta metoda prikliče iz druge metode (metoda_2 ()), ta metoda lahko ujame SQLException in jo zavijte v nepreverjeno izjemo, tako da ni treba izjaviti izjeme v svojem podpisu metode.

zasebna void metoda_2 () {poskusi {method_1 (); } ulov (java.sql. SQLException ex) {vrgel novo RuntimeException (ex); } }

Izsleditev skladov izjem

Sledenje izjema izjeme se nanaša na niz aktivnih okvirov skladov, od katerih vsak predstavlja klic metode, ki ga je zajel JVM v času, ko je bila izjema odstranjena. Vsak okvir zlaganja vključuje lokacijo priklica metode, vključno z imenom razreda, imenom metode in morda imenom izvorne datoteke Java in številko vrstice v datoteki. Koristno je za sledenje zaporedja klicev kar je povzročilo napako Izjeme Java: Ali ravnate z njimi prav?Izjema pri programiranju pomeni izjemen pogoj pri izvajanju programa. Uporablja se, kadar je stanje mogoče rešiti bolje drugje. Razmislite o naslednjih primerih ravnanja z izjemami Java. Preberi več .

Tu je značilna sled skladnosti, pridobljena iz predmeta izjem, ko je bil ujet.

Izjema v niti "glavni" java.lang. IndexOutOfBoundsException: Index: 8, Velikost: 5 pri java.util. ArrayList.rangeCheck (ArrayList.java: 653) na java.util. ArrayList.get (ArrayList.java: 429) na sample.sample1.main (sample1.java: 24)

Tu izjema je izjema IndexOutOfBoundsException. Vključuje dodatne informacije o napaki. Sled sklad vsebuje 3 okvirje skladanja, od katerih vsak vključuje podatke o lokaciji, kot je prikazano.

Ravnanje izjem

Izjemo lahko rešimo tako, da jo ujamemo v poskusite ujeti blokirati in sprejeti kakršne koli korektivne ukrepe. The Izjema Predmet ponuja več načinov za pridobivanje informacij o stanju, ki ga je povzročil.

Naslednja koda zabeleži sporočilo o napaki v datoteko dnevnika.

zasebna void loadConfig () {poskusi {// prikliči kodo, ki lahko ustvari ulov IOException} (java.io. IOException ex) {// tukaj ravnajte z izjemo. Lahko se prijavite v datoteko dnevnika. log.pozorjenje (ex.getMessage ()); } }

Ko je izjema zavita v drugo, lahko dobite zavzeto izjemo:

Napačni vzrok = ex.getCause (); log.warning ("Osnovni vzrok:" + reason.getMessage ()); 

Ali morate dostopati do sledi skladanja in morda izvleči ime metode, ki jo je povzročil?

StringBuilder sbuf = nov StringBuilder ("sled skladnosti:"); za (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). dodaj ("\ n"); } log.warning (sbuf.toString ());

Ali morda prijavite izjemo in jo ponovno zavrnete?

poskusi {... } ulov (java.io. IOException ex) {log.warning (ex.getMessage ()); vrgel ex; }

The Izjema razred zagotavlja a printStackTrace () metoda, ki lahko natisne sled skladnosti po svoje PrintStream (ali PrintWriter).

poskusi {... } ulov (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (ven); }

V enem lahko ujamete več vrst izjem poskusi blokirati in izvajati specifična ravnanja za vsako vrsto izjem.

poskusite {// vrže nekaj izjem tukaj. } ulov (java.io. IOException ex) {// IOException specifično ravnanje tukaj. } ulov (java.sql. SQLException ex) {// SQLException specifično ravnanje tukaj. }

Če želite ujeti več vrst izjem, vendar uporabljati isto kodo za ravnanje, lahko deklarirate a ujeti blok z več vrstami, kot sledi:

poskusite {// vrže nekaj izjem tukaj. } ulov (java.io. IOException | java.sql. SQLException ex) {// IOException in SQLException specifično ravnanje tukaj. } ulov (SAXException ex) {// SAXException, specifično ravnanje tukaj. }

Čiščenje virov končno

Pri obravnavi kode, ki lahko vrže izjeme, je nujno pravilno čiščenje vseh virov, kot so odprte datoteke Vse, kar morate vedeti o oblikah datotek in njihovih lastnostihBesedno datoteko uporabljamo zamenljivo: glasba, slika, preglednica, diaprojekcija itd. Toda kaj sploh pomeni datoteko "datoteko"? Poskusimo in razumemo ta temeljni del računanja. Preberi več , povezave z bazo podatkov itd. Čiščenje virov je treba izvesti v končno blok. Tako se običajni izhod in izjemen izhod iz bloka prikličeta koda za čiščenje 10 najhujših napak v programiranju v zgodoviniV svoji zgodovinski preteklosti je bilo kodiranje kovanega uničenja tudi. Primeri malo slabe kode so na velikem nivoju povzročili katastrofo. Sledi 10 najhujših programskih napak v zgodovini. Preberi več .

InputStream in = null; poskusi {... in = nov FileInputStream (ime datoteke);... } ulov (java.io. IOException ex) {log.warning (ex.getMessage ()); } končno {// koda tukaj se izvede ob izhodu iz poskusnega bloka, // bodisi običajno bodisi zaradi izjeme, če (in! = null) in.close (); }

Preizkusite z viri

Java 1.7 je predstavila preizkusite z viri konstrukt, ki olajša čiščenje virov. Takole izgleda:

poskusite (InputStream in = nov FileInputStream (..)) {// koda, ki uporablja InputStream. }

Ko koda izstopi iz bloka (bodisi čisto ali zaradi izjeme), se InputStream spremenljivka se samodejno očisti.

Očistite več virov tako, da jih razglasite v glavi bloka.

poskusite (InputStream in = nov FileInputStream (..); Povezava con =...; ) {// koda, ki uporablja InputStream in Connection. }

Vsak predmet, katerega razred izvaja AutoCloseable Vmesnik je mogoče očistiti na ta način. Naslednji razred izvaja nekaj posebnega čiščenja v zapri () metoda.

javni razred MyClass izvaja samodejno zapiranje {public void close () {// tukaj čistilna koda} }

Uporabite primerek tega razreda v preizkusite z viri blok.

poskusite (MyClass obj = nov MyClass (..)) {// koda, ki uporablja objekt MyClass. }

Nekaj ​​pogostih izjem

Zdaj si oglejmo nekaj pogosto izjeme.

  • IndexOutOfBoundsException (neoznačeno): označuje, da je indeks, do katerega dostopate, zunaj meja matrike, niza itd.
  • SQLException (preverjeno): vržen zaradi napake v bazi podatkov.
  • IOException (Označeno): napaka v dostopu do datoteke ali napake, povezane z vnosom in izhodom.
  • InterruptException (označeno): vržen, ko je izvedba niti prekinjena.
  • SAXException (označeno): vrženo zaradi napak pri razčlenjevanju XML
  • NullPointerException (neoznačeno): uporaba null, kadar je predmet potreben.

Zavijanje

Izjeme so glavna metoda za poročanje o napakah in upravljanje na Javi. Pravilna uporaba izjem izboljšati kakovost kode Napi orite ali kodirajte hitreje v urejevalniku besedil Linux s temi po meriVaš urejevalnik besedil v Linuxu ne mora biti videti "funkcionalen". Zakaj ga ne bi prilagodili, če želite izboljšati svojo produktivnost, ne glede na to, ali skriptno kodiranje ali uporabo orodja kot urejevalnik oznak? Preberi več in pomoč pri reševanju vprašanj v proizvodnji.

Ali imate kakšno vojno zgodbo, povezano z izjemo? Če je tako, nam o tem povejte v spodnjem razdelku s komentarji.

Kreditna slika: Dmitrij Nikolaev preko Shutterstock.com