Reklāma

Izņēmums programmēšanā nozīmē izņēmuma stāvokli kādā programmas izpildes brīdī. To izmanto, ja ar ārkārtas stāvokli var labāk rīkoties citur, nevis tur, kur tas rodas. Apsveriet šādus piemērus:

  • Konfigurācijas faila neatvēršanu var labāk novērst kodā, iespējams, izmantojot alternatīvu konfigurācijas faila atrašanās vietu.
  • Piekļuve masīva vienums Kā izmantot Java ArrayListJava masīvu saraksts ir vispārēja mēroga masīvs. Tas nodrošina lielāko daļu iespēju, ko parasti sagaida no masīviem citās valodās. Šajā rakstā jūs uzzināsit, kā iestatīt un izmantot kopētāju sarakstu. Lasīt vairāk ārpus masīva robežām apzīmē programmas kļūdu. Priecīgu atkļūdošanu!
  • XML parsēšanas kļūda jādara zināma lietotājam, lai XML failu varētu labot.
  • Programmai, kurai trūkst atmiņas (varbūt, apstrādājot lielu failu), var labot, iespējams, palielinot javas procesam pieejamo atmiņas daudzumu.

Visos šajos gadījumos (un vairākos gadījumos) izņēmums jārisina ārpus tā radīšanas vietas, lai varētu novērst galveno cēloni.

instagram viewer

Izņēmumu veidi

Zemāk redzamais attēls parāda Java izņēmumu hierarhijas galvenās daļas. Pamatklase ir Metamie kas tiek klasificēts apakšgrupā Izņēmums un Kļūda. Klase Izņēmums ir paredzēts ar programmu saistītiem nosacījumiem, kurus lietojumprogrammas var noķert, mēģinot glābt situāciju. Klase Kļūda, no otras puses, ir paredzēts nopietnu kļūdu norādīšanai Java izpildlaika vidē, kuras lietojumprogrammām nevajadzētu noķert. Daži piemēri: OutOfMemoryError un StackOverflowError.

Izņēmumu hierarhija

An Izņēmums atkal ir divu veidu: pārbaudīti un bez izvēles. Pārbaudīts izņēmums ir jāapstrādā ar izsaucēja kodu. Šo noteikumu izpilda java kompilators. Nepārbaudītu izņēmumu, no otras puses, var izplatīt augšup zvanu ķēdē, neprasot to skaidri deklarēt. Zemāk minētie piemēri tiks precizēti.

Pārbaudīti izņēmumi

Šī metode mēģina izveidot FileReader no faila. Konstruktors izmet pārbaudītu izņēmumu FileNotFoundException kas jāapstrādā ar izsaukuma kodu vai jāpaziņo par izmestu.

Šis kods būs apkopo, jo tas neveic nevienu.

private void loadFile (virknes faila nosaukums) {FileReader in = jauns FileReader (faila nosaukums); }

Viens veids, kā iegūt kodu, lai sastādītu, ir rīkoties ar izņēmumu (skatīt zemāk).

private void loadFile (virknes faila nosaukums) {izmēģiniet {FileReader in = new FileReader (faila nosaukums)); {} noķert (FileNotFoundException ex) {// rīkoties ar izņēmumu šeit} }

Ja zvanītājs nevar tieši rīkoties ar izņēmumu, tas jāpaziņo metodes parakstā.

private void loadFile (virknes faila nosaukums) izmet java.io. FileNotFoundException. {FileReader in = new FileReader (faila nosaukums)); { }

Neatzīmētie izņēmumi

Neatzīts izņēmums ir tas, kas tiek klasificēts apakšklasē RuntimeException un ar tiem nav jārīkojas tieši vai jādeklarējas, kā minēts iepriekš. Piemēram, šāds kods rada a NullPointerException, kas ir RuntimeException. Kopš tā laika kods tiek apkopots bez kļūdām NullPointerException ir nepārbaudīts izņēmums.

private void handleEvent () {Stīgas nosaukums = nulle; if (name.length ()> 0) {} }

Iesaiņošanas izņēmumi

Ņemot vērā iepriekšminēto diskusiju par pārbaudītajiem un nekontrolētajiem izņēmumiem, šķiet, ka ir vieglāk tikt galā ar nekontrolētiem izņēmumiem, jo ​​jums tie nav jādeklarē vai nav ar tiem jārīkojas pats. Paturot prātā šīs ērtības, dažreiz var būt noderīgi iesaiņot pārbaudītu izņēmumu nepārbaudītā izņēmumā.

Šis koda piemērs parādīja, kā ietīt izņēmumu. Metode metode_1 () izmet SQLException savā ķermenī. Lai kods pareizi sastādītu, izņēmums ir jādeklarē kā izmests.

privātā tukšuma metode_1 () rada SQLException {... mest jauno SQLException; }

Kad šī metode tiek izmantota no citas metodes (metode_2 ()), šī metode var noķert SQLException un iesaiņojiet to nekontrolētā izņēmumā, tāpēc metodes parakstā tas nav jādeklarē.

private void method_2 () {mēģiniet {method_1 (); } noķert (java.sql. SQLException ex) {mest jauno RuntimeException (ex); } }

Izņēmuma steka pēdas

Izņēmuma steka izsekošana attiecas uz aktīvo steku kadru masīvu, no kuriem katrs apzīmē metodes izsaukšanu, ko JVM uztvēra laikā, kad izmetums tika uzmests. Katrā skursteņa rāmī ir ietverta metodes izsaukšanas vieta, ieskaitot klases nosaukumu, metodes nosaukumu un, iespējams, java avota faila nosaukumu un faila rindiņas numuru. Tas ir noderīgi, lai izsekotu zvanu secību kas izraisīja kļūdu Java izņēmumi: vai jūs tos apstrādājat pareizi?Izņēmums programmēšanā nozīmē izņēmuma stāvokli programmas izpildē. To izmanto, ja ar šo stāvokli var labāk rīkoties citur. Apsveriet šādus Java izņēmumu apstrādes piemērus. Lasīt vairāk .

Šeit ir raksturīga kaudze, kas iegūta no izņēmuma objekta, kad tā tika noķerta.

Izņēmums pavediena "galvenajā" java.lang. IndexOutOfBoundsException: Indekss: 8, Izmērs: 5 vietnē java.util. ArrayList.rangeCheck (ArrayList.java: 653) vietnē java.util. ArrayList.get (ArrayList.java: 429) vietnē sample.sample1.main (sample1.java: 24)

Šeit pieķertais izņēmums ir IndexOutOfBoundsException. Tajā ir iekļauta papildu informācija par kļūdu. Steka izsekojumā ir 3 steku rāmji, no kuriem katrs satur informāciju par atrašanās vietu, kā parādīts.

Izņēmumu apstrāde

Izņēmumu var novērst, noķerot to mēģiniet noķert bloķēt un veikt nepieciešamās koriģējošās darbības. Izņēmums objekts nodrošina vairākas metodes, kā iegūt informāciju par stāvokli, kas to izraisījis.

Šis kods kļūdas ziņojumu reģistrē žurnāla failā.

private void loadConfig () {mēģiniet {// izsaukt kodu, kas varētu radīt IOException} nozveju (java.io. IOException ex) {// šeit apskatiet izņēmumu. Var reģistrēties žurnālfailā. log.warning (ex.getMessage ()); } }

Kad izņēmums ir iesaiņots citā, jūs varat atgūt iesaiņoto izņēmumu:

Iemesls = ex.getCause (); log.warning ("Cēlonis:" + iemesls.getMessage ()); 

Vai jums ir jāpiekļūst steka izsekošanai un varbūt jāizņem tās metodes nosaukums, kas to izraisīja?

StringBuilder sbuf = jauns StringBuilder ("Stack Trace:"); priekš (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()) .pielikums ("\ n"); } log.warning (sbuf.toString ());

Vai varbūt, reģistrējiet izņēmumu un atkārtojiet to?

izmēģiniet {... } noķert (java.io. IOException ex) {log.warning (ex.getMessage ()); mest ex; }

Izņēmums klase nodrošina a printStackTrace () metode, kas var izdrukāt kaudzītes pēdas jūsu pašu PrintStream (vai PrintWriter).

izmēģiniet {... } noķert (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (out); }

Vienā var iegūt vairāku veidu izņēmumus mēģiniet bloķēt un veikt īpašu apstrādi katram izņēmuma veidam.

mēģiniet {// šeit izmet dažus izņēmumus. } noķert (java.io. IOException ex) {// IOException specifiska apstrāde šeit. } noķert (java.sql. SQLException ex) {// SQLException specifiska apstrāde šeit. }

Lai noķertu vairākus izņēmumu veidus, bet izmantotu to pašu apstrādes kodu, varat deklarēt a noķert bloks ar vairākiem veidiem:

mēģiniet {// šeit izmet dažus izņēmumus. } noķert (java.io. IOException | java.sql. SQLException ex) {// IOException un SQLException īpašā apstrāde šeit. } nozveja (SAXException ex) {// SAXException specifiska apstrāde šeit. }

Resursu sakopšana beidzot

Darbojoties ar kodu, kas var radīt izņēmumus, ir svarīgi pienācīgi iztīrīt visus resursus, piemēram, atvērtos failus Viss, kas jums jāzina par failu formātiem un to īpašībāmMēs vārdu failu izmantojam aizvietojami: mūzika, attēls, izklājlapa, slaidrāde un tā tālāk. Bet kas tik un tā padara failu par failu? Mēģināsim izprast šo skaitļošanas pamatdaļu. Lasīt vairāk , datu bāzu savienojumi utt. Resursu tīrīšana jāveic a beidzot bloķēt. Tādā veidā gan parasta izeja, gan ārkārtas izeja no bloka izsauc tīrīšanas kods 10 sliktākās programmēšanas kļūdas vēsturēStāstā pagātnē kodēšana arī iznīcināja. Nedaudz slikta koda gadījumi izraisīja katastrofu lielā līmenī. Šīs ir 10 vissliktākās programmēšanas kļūdas vēsturē. Lasīt vairāk .

InputStream in = null; izmēģiniet {... in = jauns FileInputStream (faila nosaukums);... } noķert (java.io. IOException ex) {log.warning (ex.getMessage ()); } beidzot {// kods šeit tiek izpildīts, izejot no mēģinājuma bloka, // parasti vai izņēmuma dēļ, ja (in! = null) in.close (); }

Izmēģiniet ar resursiem bloķēšana

Java 1.7 ieviesa izmēģiniet resursus konstrukcija, kas atvieglo resursu tīrīšanu. Tas izskatās šādi:

mēģiniet (InputStream in = new FileInputStream (..))) {// kods, kas izmanto InputStream. }

Kad kods aiziet no bloka (tīri vai izņēmuma dēļ), InputStream mainīgais tiek automātiski iztīrīts.

Notīriet vairākus resursus, deklarējot tos visus bloka galvā.

mēģiniet (InputStream in = new FileInputStream (..); Savienojums con =...; ) {// kods, kas izmanto InputStream un savienojumu. }

Jebkurš objekts, kura klase realizē Automātiski noslēdzams interfeisu var iztīrīt šādā veidā. Šī klase veic kādu īpašu tīrīšanu aizvērt () metode.

publiskajā klasē MyClass ievieš automātisko aizvēršanu {public void close () {// tīrīšanas kods šeit} }

Izmantojiet šīs klases gadījumu a izmēģiniet resursus bloķēt.

mēģiniet (MyClass obj = new MyClass (..)) {// kods, kas izmanto MyClass objektu. }

Daži bieži sastopami izņēmumi

Tagad apskatīsim dažus bieži sastopamus izņēmumus.

  • IndexOutOfBoundsException (nav atzīmēts): norāda, ka pieejamā elementa indekss ir ārpus masīva, virknes utt. robežām.
  • SQLException (pārbaudīts): izmests datu bāzes kļūdas dēļ.
  • IOException (pārbaudīts): faila piekļuves kļūda vai kļūdas, kas saistītas ar ieeju un izvadi.
  • PārtrauktsException (pārbaudīts): izmests, kad pavediena izpilde tiek pārtraukta.
  • SAXException (pārbaudīts): izmests XML parsēšanas kļūdu dēļ.
  • NullPointerException (nav atzīmēts): nulles izmantošana, ja nepieciešams objekts.

Iesaiņošana

Izņēmumi ir galvenā metode kļūdu paziņošanai un pārvaldībai Java. Pareiza izņēmumu izmantošana uzlabot koda kvalitāti Rakstiet vai kodējiet ātrāk savā Linux teksta redaktorā ar pielāgotajām tēmāmJūsu Linux teksta redaktoram nav jābūt izskatīgam un “funkcionālam”. Kāpēc gan to nepielāgojat, lai uzlabotu savu produktivitāti, neatkarīgi no tā, vai notiek skriptu veidošana un kodēšana, vai izmantojot rīku kā iezīmēšanas redaktoru? Lasīt vairāk un palīdzēt atrisināt problēmas ražošanā.

Vai jums ir kādi kara stāsti, kas saistīti ar izņēmumiem? Ja tā, pastāstiet mums par to zemāk komentāru sadaļā.

Attēla kredīts: Dmitrijs Nikolajevs, izmantojot vietni Shutterstock.com