Reklaam

Erand programmeerimisel tähistab programmi täitmise mingil hetkel erandolukorda. Seda kasutatakse siis, kui erandlikke tingimusi saab paremini käsitleda mujal, mitte seal, kus seda esineb. Vaatleme järgmisi näiteid:

  • Konfiguratsioonifaili avamata jätmist saab paremini lahendada koodis kõrgemal, võib-olla mõne muu konfiguratsioonifaili asukoha abil.
  • Juurdepääs massiivi üksus Java ArrayListi kasutamineJava-arüülilisti on üldotstarbeline massiiv. See pakub enamiku võimalustest, mida tavaliselt võidakse kasutada massiivi teistes keeltes. Selles artiklis saate teada masilisti nimekirja seadistamist ja kasutamist. Loe rohkem väljaspool massiivi piire tähendab programmi viga. Head silumist!
  • XML-i parsimisviga tuleks kasutajale teatavaks teha, et XML-faili saaks parandada.
  • Programmi mälu hakkab otsa saama (võib-olla suure faili töötlemisel) parandamiseks, suurendades võib-olla java protsessi jaoks saadaolevat mälumahtu.

Kõigil neil (ja enamatel) juhtudel tuleks erandit käsitleda väljaspool selle tekkekohta, et algpõhjus saaks lahendatud.

instagram viewer

Erandite tüübid

Allolev pilt näitab Java erandihierarhia põhiosasid. Põhiklass on Viskatav mis klassifitseeritakse alamrühma Erand ja Viga. Klass Erand on mõeldud programmiga seotud tingimuste jaoks, mida rakendused võivad olukorra parandamiseks püüda. Klass Vigaseevastu on Java Run-time keskkonnas tõsiste vigade näitamiseks, mida rakendused ei peaks püüdma. Mõned näited: OutOfMemoryError ja StackOverflowError.

Erandihierarhia

An Erand on jällegi kahte tüüpi: kontrollitud ja märkimata. Kontrollitud erandit tuleb käsitleda kutsunumbriga. Seda reeglit rakendab Java-kompilaator. Teisest küljest saab kontrollimata erandi kõneahelas edasi viia, ilma et peaksite seda selgesõnaliselt deklareerima. Allpool toodud näited selgitavad.

Kontrollitud erandid

Järgmine meetod proovib luua FileReader failist. Ehitaja viskab kontrollitud erandi FileNotFoundException mida tuleb käsitseda kutsunumbri abil või kuulutada visatuks.

Järgmine kood on mitte kompileerima, kuna seda ei tehta.

private void loadFile (stringi failinimi) {FileReader in = new FileReader (failinimi); }

Üks viis koodi kompileerimiseks on erandiga tegelemine (vt allpool).

private void loadFile (stringi failinimi) {proovige {FileReader in = new FileReader (failinimi)); {} saak (FileNotFoundException ex) {// käsitle erandit siin} }

Kui erandit ei saa helistaja otse käsitleda, tuleb see deklareerida meetodi allkirjas.

private void loadFile (stringi failinimi) viskab java.io. FileNotFoundException. {FileReader in = new FileReader (failinimi)); { }

Märgistamata erandid

Kontrollimata erand on alamklassi kuuluv erand RuntimeException ja neid ei pea käsitsema otse ega deklareerima nagu eespool kirjeldatud. Näiteks annab järgmine kood tulemuseks a NullPointerException, mis on teatud tüüpi RuntimeException. Kood kompileeritakse sellest hoolimata vigadeta NullPointerException on kontrollimata erand.

private void handleEvent () {Stringi nimi = null; if (nimi.pikkus ()> 0) {} }

Erandite pakkimine

Arvestades ülaltoodud arutelu kontrollitud ja kontrollimata erandite üle, näib, et kontrollimata eranditega on lihtsam tegeleda, kuna te ei pea neid deklareerima ega nendega ise hakkama saama. Seda mugavust silmas pidades võib mõnikord olla kasulik pakkida kontrollitud erand kontrollimata erandisse.

Järgmine koodinäide näitas, kuidas erandit mähkida. Meetod meetod_1 () viskab SQLException oma kehas. Koodi korrektseks kompileerimiseks tuleb erand erandiks kuulutada.

private void method_1 () viskab SQLExceptioni {... viska uus SQLException; }

Kui sellele meetodile tuginetakse teisest meetodist (meetod_2 ()), selle meetodiga saab hakkama SQLException ja mähkige see kontrollimata erandi sisse, nii et ta ei pea erandit oma meetodi allkirjas deklareerima.

private void method_2 () {proovige {method_1 (); } saagi (java.sql. SQLException ex) {viska uus RuntimeException (ex); } }

Erandkorstna jälg

Erandkorstna jälg viitab aktiivsete virnade kaadrite massiivile, millest igaüks tähistab meetodi kutsumist ja mille JVM on hõivanud ajal, mil erand visati. Iga virnaraam sisaldab meetodi kutsumise asukohta, sealhulgas klassi nime, meetodi nime ja võimaluse korral failis oleva Java-lähtefaili nime ja rea ​​numbri. See on kasulik kõnede jada jälgimiseks mis põhjustas vea Java-erandid: kas käitate neid õigesti?Erand programmeerimisel tähistab erandlikku tingimust programmi täitmisel. Seda kasutatakse siis, kui seisundit saab mujal paremini lahendada. Mõelge järgmistele Java-erandite käsitlemise näidetele. Loe rohkem .

Siin on tüüpiline virnajälg, mis saadakse erandobjektist, kui see kinni püüti.

Erand lõimes "peamine" java.lang. IndexOutOfBoundsException: register: 8, suurus: 5 saidil java.util. ArrayList.rangeCheck (ArrayList.java: 653) java.util. ArrayList.get (ArrayList.java: 429) saidil sample.sample1.main (sample1.java: 24)

Siin püütud erand on IndexOutOfBoundsException. See sisaldab lisateavet vea kohta. Virnajälg sisaldab 3 virnaraami, millest igaüks sisaldab asukohateavet nagu näidatud.

Erandite käsitlemine

Erandit saab lahendada, püüdes selle sisse a proovida-püüda blokeerida ja võtta kõik vajalikud parandusmeetmed. Erand objekt pakub mitmeid meetodeid teabe hankimiseks selle põhjustanud seisundi kohta.

Järgmine kood logib tõrketeate logifaili.

private void loadConfig () {proovi {// käivitada kood, mis võib tekitada IOException} saagi (java.io. IOException ex) {// käsitle erandit siin. Võib logida logifaili. log.hoiatus (ex.getMessage ()); } }

Kui erand on mähitud teise sisse, saate pakitud erandi taastada:

Loovutatav põhjus = ex.getCause (); log.warning ("Aluspõhjus:" + põhjus.getMessage ()); 

Kas peate juurde pääsema virna jäljele ja võib-olla ekstraktida selle põhjustanud meetodi nimi?

StringBuilder sbuf = uus StringBuilder ("Stack Trace:"); jaoks (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); } log.hoiatus (sbuf.toString ());

Või äkki logige erand sisse ja loovutage uuesti?

proovige {... } saagi (java.io. IOException ex) {log.warning (ex.getMessage ()); viska ex; }

Erand klass pakub a printStackTrace () meetod, mille abil saab virna jälje ise printida PrintStream (või PrintWriter).

proovige {... } saagi (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (out); }

Saate püüda korraga mitut tüüpi erandeid proovida blokeerida ja teostada konkreetset käsitsemist igat tüüpi erandite korral.

proovige {// viskab siia mõned erandid. } saagi (java.io. IOException ex) {// siin käsitletakse IOExceptioni konkreetset käsitlemist. } saagi (java.sql. SQLException ex) {// SQLExceptioni spetsiifiline käsitlemine siin. }

Mitme eranditüübi püüdmiseks, kuid sama töötlemiskoodi kasutamiseks võite kuulutada a saagi mitut tüüpi plokk järgmiselt:

proovige {// viskab siia mõned erandid. } saagi (java.io. IOException | java.sql. SQLException ex) {// IOException ja SQLException spetsiifiline käsitlemine siin. } saak (SAXException ex) {// SAXException konkreetne käitlemine siin. }

Ressursside puhastamine lõpuks

Koodiga tegelemisel, mis võib erandeid teha, on oluline, et kõik ressursid korrektselt puhastataks, nagu avatud failid Kõik, mida peate teadma failivormingute ja nende omaduste kohtaMe kasutame sõnafaili vaheldumisi: muusika, pilt, arvutustabel, slaidiseanss ja nii edasi. Mis aga teeb failist ikkagi faili? Proovime aru saada sellest arvutuse põhiosast. Loe rohkem , andmebaaside ühendused jne. Ressursi puhastamine peaks toimuma a lõpuks blokeerida. Nii käivitavad nii tavalised kui ka erandlikud plokist väljumised puhastuskood 10 ajaloo halvimat programmeerimisvigaOma rikkalikus minevikus tabas ka kodeerimine hävingut. Natuke halva koodi juhtumid põhjustasid katastroofi suures osas. Järgnevalt on toodud kümme ajaloo halvimat programmeerimisviga. Loe rohkem .

InputStream in = null; proovige {... in = new FileInputStream (failinimi);... } saagi (java.io. IOException ex) {log.warning (ex.getMessage ()); } lõpuks käivitatakse {// kood siin prooviplokist väljumisel, // kas tavaliselt või erandi tõttu, kui (in! = null) in.close (); }

Proovike ressurssidega blokeerimine

Java 1.7 tutvustas proovida ressurssidega ressursside puhastamist hõlbustav konstruktsioon. See näeb välja selline:

proovige (InputStream in = new FileInputStream (..))) {// kood, mis kasutab InputStreami. }

Kui kood blokeeringust väljub (kas puhtalt või erandi tõttu), siis InputStream muutuja puhastatakse automaatselt.

Puhastage mitu ressurssi, kuulutades need kõik ploki peas.

proovida (InputStream in = new FileInputStream (..); Ühendus con =...; ) {// kood, mis kasutab sisendvoogu ja ühendust. }

Iga objekt, mille klass rakendab Automaatselt suletav liidest saab sel viisil puhastada. Järgmine klass viib läbi konkreetsed puhastused Sulge() meetod.

avaliku klassi MyClass rakendab automaatse sulgemise {public void close () {// puhastuskood siin} }

Kasutage selle klassi eksemplari a-s proovida ressurssidega blokeerida.

proovige (MyClass obj = new MyClass (..)) {// kood, mis kasutab MyClass objekti. }

Mõned sagedamini esinevad erandid

Vaatame nüüd mõnda sagedamini esinevat erandit.

  • IndexOutOfBoundsException (märkimata): näitab, et juurdepääsetava elemendi indeks on väljaspool massiivi, stringi jne.
  • SQLException (kontrollitud): visatud andmebaasi vea tõttu.
  • IOException (märgitud): failidele juurdepääsu viga või vead, mis on seotud sisendi ja väljundiga.
  • Katkestatud erand (kontrollitud): visatakse lõime täitmise katkestamisel.
  • SAXErand (kontrollitud): visatud XML-i parsimisvigade tõttu.
  • NullPointerException (märkimata): kasutatakse nulli, kui objekt on nõutav.

Mähkimine üles

Erandid on Java vigade esitamise ja haldamise peamine meetod. Erandite õige kasutamine parandada koodi kvaliteeti Kirjutage või kodeerige kiiremini oma Linuxi tekstiredaktoris kohandatud teemadegaTeie Linuxi tekstiredaktor ei pea nägema üksluine ja "funktsionaalne". Miks mitte seda oma tootlikkuse parandamiseks näppida, kas skriptimine ja kodeerimine või tööriista kasutamine märgistuse redaktorina? Loe rohkem ja abi probleemide lahendamisel tootmises.

Kas teil on mõni erandiga seotud sõjalugu, mida seostada? Kui jah, rääkige meile sellest allpool kommentaaride jaotises.

Pildikrediit: Dmitry Nikolaev saidi Shutterstock.com kaudu