Publicitate

O excepție în programare semnifică o condiție excepțională la un moment dat în execuția programului. Este utilizat atunci când starea excepțională poate fi manipulată mai bine în altă parte decât în ​​locul în care este întâlnită. Ia în considerare următoarele exemple:

  • Imposibilitatea deschiderii unui fișier de configurare poate fi mai bine gestionată mai sus în cod, poate folosind o locație alternativă a fișierului de configurare.
  • Accesarea unui element de matrice Cum se utilizează o matrice Java ArrayListO matrice Java este un tablou redimensionabil cu scop general. Acesta oferă cea mai mare parte a facilităților, în general, așteptate de matrice în alte limbi. În acest articol veți învăța să configurați și să utilizați un tablou de listă. Citeste mai mult în afara limitelor tabloului semnifică o eroare de program. Debugging fericit!
  • O eroare de analizare XML trebuie adusă la cunoștința utilizatorului, astfel încât fișierul XML să poată fi corectat.
  • Programul care rămâne fără memorie (poate atunci când prelucrați un fișier mare) poate fi rectificat prin creșterea cantității de memorie disponibilă procesului java.
    instagram viewer

În toate aceste cazuri (și mai multe), excepția ar trebui să fie tratată în afara locației unde este generată, astfel încât să fie abordată cauza de bază.

Tipuri de excepții

Imaginea de mai jos prezintă principalele părți ale Ierarhiei de excepție Java. Clasa de bază este Dispensabil care este sub-clasificat în Excepție și Eroare. Clasă Excepție este pentru condițiile legate de program pe care aplicațiile le pot prinde în încercarea de a salva situația. Clasă Eroare, pe de altă parte, este pentru indicarea erorilor grave în mediul de execuție Java pe care aplicațiile nu ar trebui să le prindă. Câteva exemple sunt: OutOfMemoryError și StackOverflowError.

Ierarhie de excepție

Un Excepție din nou este de două tipuri: verificat și bifat. O excepție verificată trebuie gestionată de codul apelant. Această regulă este aplicată de compilatorul java. Pe de altă parte, o excepție marcată, poate fi propagată în lanțul de apeluri fără a fi necesară declararea explicită. Exemplele de mai jos vor clarifica.

Excepții verificate

Următoarea metodă încearcă să creeze FileReader dintr-un fișier. Constructorul aruncă o excepție verificată FileNotFoundException care trebuie să fie manipulat de codul apelant sau declarat a fi aruncat.

Următorul cod va nu compila din moment ce nu face niciuna.

private void loadFile (nume de fișier String) {FileReader in = new FileReader (nume de fișier); }

O modalitate de a obține codul pentru a compila este de a gestiona excepția (vezi mai jos).

private void loadFile (nume de fișier String) {try {FileReader in = new FileReader (nume de fișier)); {} catch (FileNotFoundException ex) {// excepție de gestionare aici} }

Dacă excepția nu poate fi gestionată direct de apelant, aceasta trebuie să fie declarată în semnătura metodei.

private void loadFile (numele de fișier String) aruncă java.io. FileNotFoundException. {FileReader in = new FileReader (nume de fișier)); { }

Excepții necontrolate

O excepție marcată este una din care este subclasată RuntimeException și nu trebuie manipulate direct sau declarate ca mai sus. De exemplu, următorul cod are ca rezultat un NullPointerException, care este un tip de RuntimeException. Totuși, codul compilează fără eroare de atunci NullPointerException este o excepție marcată.

private void handleEvent () {Nume șir = nul; if (nume.lungime ()> 0) {} }

Excepții de înfășurare

Având în vedere discuția de mai sus despre excepțiile verificate și neschimbate, se pare că este mai ușor să faci față excepțiilor necherificate, deoarece nu trebuie să le declari sau să le gestionezi singur. Având în vedere această comoditate, poate fi uneori util să înfășurați o excepție bifată într-o excepție marcată.

Următorul exemplu de cod arată cum să înfășurați o excepție. Metoda method_1 () aruncă un SQLException în corpul său. Pentru ca codul să compileze corect, excepția trebuie să fie declarată aruncată.

private void method_1 () aruncă SQLException {... aruncă un nou SQLException; }

Când această metodă este invocată dintr-o altă metodă (method_2 ()), această metodă poate prinde SQLException și înfășurați-o într-o excepție marcată, deci nu trebuie să declare excepția în semnătura metodei sale.

private void method_2 () {try {method_1 (); } prinde (java.sql. SQLException ex) {aruncă noi RuntimeException (ex); } }

Excepție Urmărit Stack

O excepție Stack Trace se referă la tabloul de cadre de stivă active, fiecare dintre acestea reprezentând o invocare a metodei, capturată de JVM în momentul în care a fost lansată excepția. Fiecare cadru de stivă include locația invocării metodei incluzând numele clasei, numele metodei și, eventual, numele fișierului sursă java și numărul liniei din fișier. Este util pentru urmărirea secvenței de apeluri asta a provocat eroarea Excepții Java: le gestionați corect?O excepție în programare semnifică o condiție excepțională în execuția programului. Este folosit atunci când starea poate fi tratată mai bine în altă parte. Luați în considerare următoarele exemple de gestionare a excepțiilor Java. Citeste mai mult .

Iată o urmă tipică de stivă, obținută din obiectul de excepție când a fost prinsă.

Excepție în firul "principal" java.lang. IndexOutOfBoundsException: Index: 8, Size: 5 at java.util. ArrayList.rangeCheck (ArrayList.java: 653) la java.util. ArrayList.get (ArrayList.java: 429) la sample.sample1.main (sample1.java: 24)

Excepția surprinsă aici este IndexOutOfBoundsException. Include informații suplimentare despre eroare. Urmăritul stivei conține 3 cadre de stivă, fiecare incluzând informațiile despre locație așa cum este arătat.

Excepții de gestionare

O excepție poate fi tratată prinzând-o într-un încearcă să prinzi blocați și luați orice măsuri corective necesare. Excepție obiectul oferă mai multe metode pentru extragerea informațiilor despre starea care a determinat-o.

Următorul cod înregistrează mesajul de eroare într-un fișier jurnal.

private void loadConfig () {try {// invoca cod care ar putea genera o captură IOException} (java.io. IOException ex) {// gestionează excepția aici. Poate fi jurnal la un fișier jurnal. log.warning (ex.getMessage ()); } }

Când o excepție este înfășurată într-o altă, puteți prelua excepția învelită:

Throwable cause = ex.getCause (); log.warning ("Cauza de bază:" + cause.getMessage ()); 

Aveți nevoie să accesați urmele de stivă și poate extrageți numele metodei care a provocat-o?

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

Sau poate, înregistrați excepția și regăsiți-o?

încerca {... } prinde (java.io. IOException ex) {log.warning (ex.getMessage ()); arunca ex; }

Excepție clasa oferă un printStackTrace () metoda care poate tipări urmele stivei pe cont propriu PrintStream (sau PrintWriter).

încerca {... } prinde (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (out); }

Puteți surprinde mai multe tipuri de excepții într-o singură încerca blocați și efectuați manipulări specifice pentru fiecare tip de excepție.

încercați {// aruncă câteva excepții aici. } prinde (java.io. IOException ex) {// Manipulare specifică IOException aici. } prinde (java.sql. SQLException ex) {// SQLException manipulare specifică aici. }

Pentru a prinde mai multe tipuri de excepție, dar utilizați același cod de manipulare, puteți declara a captură bloc cu mai multe tipuri după cum urmează:

încercați {// aruncă câteva excepții aici. } prinde (java.io. Excepție IOE | java.sql. SQLException ex) {// Tratarea specifică IOException și SQLException aici. } prindere (ex. SAXException) {// manipulare specifică SAXException aici. }

Curățarea resurselor cu sfârșitul

Atunci când aveți de-a face cu cod care poate arunca excepții, este esențial să efectuați o curățare corespunzătoare a oricăror resurse, cum ar fi fișierele deschise Tot ceea ce trebuie să știți despre formate de fișiere și proprietățile acestoraFolosim fișierul cuvânt în mod interschimbabil: muzică, imagine, foaie de calcul, prezentare de diapozitive și așa mai departe. Dar ce face din fișier un „fișier”, oricum? Să încercăm să înțelegem această parte fundamentală a calculului. Citeste mai mult , conexiuni la baze de date etc. Curățarea resurselor trebuie efectuată în a in cele din urma bloc. Astfel, ieșirea normală și ieșirea excepțională dintr-un bloc invocă cod de curățare Cele 10 mai greșite greșeli de programare din istorieÎn trecutul său depozitat, codifică și distrugerea forțată. Cazurile cu un cod rău au provocat dezastre la un nivel major. Următoarele sunt 10 dintre cele mai grave greșeli de programare din istorie. Citeste mai mult .

InputStream in = null; încerca {... in = new FileInputStream (nume de fișier);... } prinde (java.io. IOException ex) {log.warning (ex.getMessage ()); } în sfârșit {// codul de aici este executat la ieșirea din blocul try, // indiferent dacă este normal sau din cauza unei excepții if (in! = null) in.close (); }

Încercați cu resurse bloc

Java 1.7 a introdus încercați-cu-resurse construirea care face mai ușor curățarea resurselor. Arată astfel:

try (InputStream in = new FileInputStream (..)) {// cod care folosește InputStream. }

Când codul iese din bloc (curat sau datorită unei excepții), InputStream variabila este curățată automat.

Curățați mai multe resurse declarându-le toate în capul blocului.

try (InputStream in = new FileInputStream (..); Conexiune con =...; ) {// cod care utilizează InputStream și conexiunea. }

Orice obiect a cărui clasă pune în aplicare AutoCloseable interfața poate fi curățată în acest mod. Clasa următoare efectuează unele curățări specifice în închide() metodă.

public class MyClass implementează AutoCloseable {public void close () {// codul de curățare aici} }

Utilizați o instanță din această clasă în a încercați-cu-resurse bloc.

try (MyClass obj = new MyClass (..)) {// cod care folosește obiectul MyClass. }

Unele excepții întâlnite în mod obișnuit

Să aruncăm acum o privire la unele excepții întâlnite frecvent.

  • IndexOutOfBoundsException (bifat): indică că indexul elementului accesat este în afara limitelor unui tablou, șir etc.
  • SQLException (verificat): aruncat din cauza unei erori a bazei de date.
  • IOException (bifat): eroare de acces la fișier sau erori legate de intrare și ieșire.
  • InterruptedException (verificat): aruncat atunci când o întrerupere a firului este întreruptă.
  • SAXException (verificat): aruncat din cauza erorilor de analizare XML.
  • NullPointerException (bifat): folosind null acolo unde este necesar un obiect.

Înveliți

Excepție reprezintă metoda principală pentru raportarea și gestionarea erorilor în Java. Utilizarea corectă a excepțiilor îmbunătăți calitatea codului Scrieți sau codați mai rapid în editorul dvs. de texte Linux cu teme personalizateEditorul de text Linux nu trebuie să arate nebun și „funcțional”. De ce să nu o modifici pentru a-ți îmbunătăți productivitatea, fie scripturi și codări sau folosind instrumentul ca editor de marcare? Citeste mai mult și ajută la rezolvarea problemelor din producție.

Aveți vreo poveste de război legată de excepții? Dacă da, spuneți-ne despre asta în secțiunea de comentarii de mai jos.

Credit imagine: Dmitry Nikolaev prin Shutterstock.com