Skelbimas
Išimtis programavimo metu reiškia išskirtinę sąlygą tam tikru programos vykdymo momentu. Jis naudojamas, kai su išskirtinėmis sąlygomis galima geriau susitvarkyti kitur, o ne ten, kur susiduriama. Apsvarstykite šiuos pavyzdžius:
- Nepavykus atidaryti konfigūracijos failo, kodą geriau naudoti aukščiau, galbūt naudojant alternatyvią konfigūracijos failo vietą.
- Prieiga prie masyvo elementas Kaip naudotis „Java ArrayList“„Java“ masyvų sąrašas yra bendrosios paskirties masyvas. Tai suteikia daugumą galimybių, kurių paprastai tikimasi iš masyvų kitomis kalbomis. Šiame straipsnyje išmoksite nustatyti ir naudoti masyvo sąrašą. Skaityti daugiau už masyvo ribų reiškia programos klaidą. Laimingas derinimo būdas!
- XML analizės klaida turėtų būti pranešta vartotojui, kad XML failą būtų galima ištaisyti.
- Programai trūksta atminties (galbūt apdorojant didelį failą) gali būti ištaisyta padidinant „Java“ procesui prieinamos atminties kiekį.
Visais šiais atvejais (ir dar daugiau) išimtis turėtų būti taikoma ne toje vietoje, kurioje ji buvo sukurta, kad būtų galima pašalinti pagrindinę priežastį.
Išimčių rūšys
Žemiau esančiame paveikslėlyje pateikiamos pagrindinės „Java“ išimčių hierarchijos dalys. Pagrindinė klasė yra Išmetama kuris yra subklasifikuojamas į Išimtis ir Klaida. Klasė Išimtis skirtas su programa susijusioms sąlygoms, kurias programos gali sugauti bandydamos išgelbėti situaciją. Klasė Klaida, kita vertus, skirtas rimtoms „Java run-time“ aplinkos klaidoms nurodyti, kurių programos neturėtų sugauti. Keli pavyzdžiai: „OutOfMemoryError“ ir „StackOverflowError“.

An Išimtis vėlgi yra dviejų tipų: pažymėtas ir nepažymėtas. Pažymėta išimtis turi būti tvarkoma skambinančiu kodu. Šią taisyklę vykdo „Java“ kompiliatorius. Nepatikrinta išimtis, kita vertus, gali būti išplėsta skambučių grandinėje, nereikia jos aiškiai deklaruoti. Žemiau pateikti pavyzdžiai paaiškins.
Patikrintos išimtys
Šis metodas bando sukurti „FileReader“ iš bylos. Konstruktorius meta patikrintą išimtį „FileNotFoundException“ kuris turi būti tvarkomas iškviečiant kodą arba paskelbtas išmestu.
Šis kodas bus ne sudarykite, nes to nepadaro nė vienas.
„private void loadFile“ (eilutės failo vardas) {FileReader in = new FileReader (failo vardas); }
Vienas būdas gauti kodą kompiliuoti yra tvarkyti išimtį (žr. Žemiau).
„private void loadFile“ (eilutės failo vardas) {pabandykite {FileReader in = new FileReader (failo vardas)); {} sugauti (FileNotFoundException ex) {// tvarkyti išimtį čia} }
Jei išimties negali tiesiogiai išspręsti skambinantysis, ji turi būti deklaruojama metodo parašu.
„private void loadFile“ (eilutės failo vardas) meta java.io. „FileNotFoundException“. {FileReader in = new FileReader (failo vardas)); { }
Nepažymėtos išimtys
Nepatikrinta išimtis yra ta, kurios poklasis yra iš „RuntimeException“ ir jų nereikia tvarkyti tiesiogiai ar deklaruoti, kaip nurodyta aukščiau. Pvz., Dėl šio kodo gaunamas a „NullPointerException“, kurios tipas yra „RuntimeException“. Nuo to laiko kodas sudaromas be klaidų „NullPointerException“ yra nepatikrinta išimtis.
private void handleEvent () {Stygos pavadinimas = niekinis; if (name.length ()> 0) {} }
Apvyniojimo išimtys
Atsižvelgiant į aukščiau pateiktą diskusiją apie patikrintas ir nepatikrintas išimtis, atrodo, kad lengviau elgtis su nepatikrintomis išimtimis, nes nereikia jų deklaruoti ar tvarkyti pačių. Turint omenyje šį patogumą, kartais gali būti naudinga supakuoti pažymėtą išimtį į nepatikrintą išimtį.
Šiame kodo pavyzdyje parodyta, kaip apvynioti išimtį. Metodas metodas_1 () meta SQLException jo kūne. Kad kodas būtų teisingai sudarytas, išimtis turi būti paskelbta netinkama.
„private void method_1“ () išmeta „SQLException“ {... mesti naują „SQLException“; }
Kai šis metodas naudojamas iš kito metodo (metodas_2 ()), šis metodas gali sugauti SQLException ir apvyniokite ją nepatikrinta išimtimi, taigi ji neturi deklaruoti išimties savo metodo parašu.
private void method_2 () {pabandykite {method_1 (); } pagauti (java.sql. SQLException ex) {mesti naują „RuntimeException“ (ex); } }
Išimties kamino pėdsakas
Išimtinis kamino pėdsakas reiškia aktyvių kamino rėmelių masyvą, iš kurių kiekvienas reiškia metodo iškvietimą, užfiksuotą JVM tuo metu, kai buvo išmesta išimtis. Kiekvienas rietuvės rėmelis nurodo metodo iškvietimo vietą, įskaitant klasės pavadinimą, metodo pavadinimą ir, galbūt, „Java“ šaltinio failo pavadinimą bei failo eilutės numerį. Tai naudinga norint atsekti skambučių seką kad sukėlė klaidą „Java“ išimtys: ar teisingai jas tvarkote?Išimtis programuojant reiškia išskirtinę programos vykdymo sąlygą. Jis naudojamas, kai būklę galima geriau tvarkyti kitur. Apsvarstykite šiuos „Java“ išimčių tvarkymo pavyzdžius. Skaityti daugiau .
Čia yra tipiškas kamino pėdsakas, gautas iš išimtinio objekto, kai jis buvo sugautas.
Išimtis „java.lang“ gijoje. „IndexOutOfBoundsException“: Rodyklė: 8, Dydis: 5, „java.util“. „ArrayList.rangeCheck“ (ArrayList.java: 653) java.util. „ArrayList.get“ („ArrayList.java: 429“) pavyzdyje.sample1.main (pavyzdys1.java: 24)
Čia pagauta išimtis „IndexOutOfBoundsException“. Jame yra papildomos informacijos apie klaidą. Rietuvės pėdsaką sudaro 3 rietuvių rėmeliai, iš kurių kiekviename yra vietos informacijos, kaip parodyta.
Išimčių tvarkymas
Išimtį galima pašalinti sugavus ją a pabandyk pagauti blokuoti ir imtis visų būtinų taisomųjų veiksmų. Išimtis Objektas pateikia kelis būdus, kaip išgauti informaciją apie būklę, kuri jį sukėlė.
Šis kodas klaidos pranešimą registruoja žurnalo faile.
private void loadConfig () {bandykite {// iškviesti kodą, kuris gali sugeneruoti IOException} sugavimą (java.io. IOException ex) {// čia nurodykite išimtį. Gali būti prisijungiama prie žurnalo failo. log.warning (ex.getMessage ()); } }
Kai išimtis įvyniojama į kitą, galite atkurti įvyniotą išimtį:
Išmesta priežastis = ex.getCause (); log.warning („Pagrindinė priežastis:“ + priežastis.getMessage ());
Ar reikia prieiti prie kamino pėdsakų, o gal išgauti metodo, kuris jį sukėlė, pavadinimą?
„StringBuilder sbuf“ = nauja „StringBuilder“ („Stack Trace:“); for (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()) .pendpend ("\ n"); } log.warning (sbuf.toString ());
O gal prisijunkite prie išimties ir pakartokite ją?
bandyti {... } pagauti (java.io. IOException ex) {log.warning (ex.getMessage ()); mesti ex; }
Išimtis klasė teikia a „printStackTrace“ () metodas, kuris gali atspausdinti krūvos pėdsaką jūsų pačių „PrintStream“ (arba „PrintWriter“).
bandyti {... } pagauti (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (out); }
Vienoje vietoje galite rasti kelių rūšių išimtis bandyti blokuoti ir atlikti specialų tvarkymą kiekvienos rūšies išimtims.
pabandykite {// čia pateikia keletą išimčių. } pagauti (java.io. „IOException ex“) {// Čia aprašomas konkretus „IOException“ tvarkymas. } pagauti (java.sql. „SQLException ex“) {// „SQLException“ specifinis tvarkymas čia. }
Norėdami sugauti kelis išimčių tipus, tačiau naudokite tą patį tvarkymo kodą, galite deklaruoti a pagauti blokas su keliais tipais:
pabandykite {// čia pateikia keletą išimčių. } pagauti (java.io. IOException | java.sql. „SQLException ex“) {// „IOException“ ir „SQLException“ specifinis tvarkymas čia. } pagauti („SAXException ex“) {// „SAXException“ tvarkymas čia. }
Išvalyti išteklius pagaliau
Kai susiduriate su kodu, kuris gali sukelti išimčių, labai svarbu tinkamai išvalyti visus išteklius, tokius kaip atidaryti failai Viskas, ką reikia žinoti apie failų formatus ir jų ypatybesŽodinį failą naudojame pakaitomis: muzika, vaizdas, skaičiuoklė, skaidrių demonstracija ir pan. Bet kas vis dėlto daro failą „failu“? Pabandykime suprasti šią pagrindinę skaičiavimo dalį. Skaityti daugiau , duomenų bazių jungtys ir kt. Išteklių valymas turėtų būti atliekamas a pagaliau blokuoti. Tokiu būdu tiek įprastas išėjimas, tiek išskirtinis išėjimas iš bloko sukelia valymo kodas 10 blogiausių istorinių programavimo klaidųSavo sunkioje praeityje kodavimas taip pat kėlė sunaikinimą. Šiek tiek blogo kodo atvejai sukėlė didelę nelaimę. Čia yra 10 blogiausių istorijoje programavimo klaidų. Skaityti daugiau .
„InputStream“ = nulis; bandyti {... in = new FileInputStream (failo vardas);... } pagauti (java.io. IOException ex) {log.warning (ex.getMessage ()); } pagaliau {// kodas čia vykdomas išeinant iš bandymo bloko, // paprastai arba dėl išimties, jei (in! = null) in.close (); }
Išbandykite su ištekliais bloką
„Java 1.7“ pristatė išbandyti su ištekliais kuri palengvina išteklių valymą. Tai atrodo taip:
pabandykite („InputStream in = new FileInputStream (..)“) {// kodas, kuris naudoja „InputStream“. }
Kai kodas išeina iš bloko (grynai ar dėl išimties), „InputStream“ kintamasis automatiškai išvalomas.
Išvalykite kelis išteklius deklaruodami juos visus bloko galvoje.
pabandykite („InputStream“ = nauja „FileInputStream“ (..); Jungtis con =...; ) {// kodas, kuris naudoja „InputStream“ ir „Connection“. }
Bet kuris objektas, kurio klasė įgyvendina Automatiškai uždaromas sąsaja gali būti išvalyta tokiu būdu. Ši klasė atlieka tam tikrą valymą Uždaryti() metodas.
viešosios klasės „MyClass“ diegia automatinį uždarymą {public void close () {// valymo kodas čia} }
Naudokite šios klasės egzempliorių a išbandyti su ištekliais blokuoti.
pabandykite („MyClass obj = new MyClass (..)“) {// kodas, kuris naudoja „MyClass“ objektą. }
Keletas dažniausiai pasitaikančių išimčių
Pažvelkime į keletą dažniausiai pasitaikančių išimčių.
- „IndexOutOfBoundsException“ (nepažymėtas): nurodo, kokio elemento rodyklė yra už masyvo, eilutės ir kt. ribų.
- SQLException (pažymėta): išmesta dėl duomenų bazės klaidos.
- IOException (pažymėta): failo prieigos klaida arba klaidos, susijusios su įvestimi ir išvestimis.
- Pertraukta išimtis (pažymėta): išmetamas, kai nutrūksta gijos vykdymas.
- SAXException (pažymėta): išmesta dėl XML analizės klaidų.
- „NullPointerException“ (nepažymėtas): naudojant nulį, kai reikalingas objektas.
Apvyniokite
Išimtys yra pagrindinis „Java“ pranešimų apie klaidas ir jų valdymo būdas. Tinkamas išimčių naudojimas pagerinti kodo kokybę Rašykite arba greitesnį kodą naudokite savo „Linux“ teksto rengyklėje naudodami pasirinktines temasJūsų „Linux“ teksto rengyklė neturi atrodyti niūri ir „funkcionali“. Kodėl gi nepabandžius to padidinti savo produktyvumą, nesvarbu, ar scenarijus ir kodavimas, ar naudojant įrankį kaip žymėjimo rengyklę? Skaityti daugiau ir pagalba sprendžiant gamybos problemas.
Ar turite kokių su karo išimtimis susijusių istorijų? Jei taip, papasakokite apie tai žemiau esančiame komentarų skyriuje.
Vaizdo kreditas: Dmitrijus Nikolajevas per Shutterstock.com