Excepțiile Java le manipulați?

Excepțiile Java le manipulați? / Programare

O excepție în programare înseamnă o condiție excepțională la un moment dat în execuția programului. Se folosește atunci când situația excepțională poate fi tratată mai bine în altă parte decât în ​​locul unde se întâlnește. Luați în considerare următoarele exemple:

  • Nerespectarea deschiderii unui fișier de configurare poate fi mai bine tratată mai sus în cod, poate prin utilizarea unei locații alternative a fișierului de configurare.
  • Accesarea unui element din tablouri Cum se utilizează un Java ArrayList Cum se utilizează un Java ArrayList Un arrayist Java este un tablou general de redimensionare. Oferă cele mai multe dintre facilitățile care se așteaptă în general din rețele în alte limbi. În acest articol veți învăța să configurați și să utilizați un arraylist. Citiți mai mult în afara limitelor matricei înseamnă o eroare de program. Depanare fericită!
  • O eroare de parsing XML ar trebui adusă la cunoștința utilizatorului, astfel încât fișierul XML să poată fi corectat.
  • Programul care iese din memorie (poate când procesează un fișier mare) poate fi rectificat prin creșterea probabilității volumului de memorie disponibil procesului java.

În toate aceste cazuri (și mai mult), excepția ar trebui să fie tratată în afara locului în care este generată, astfel încât cauza principală să poată fi abordată.

Tipuri de excepții

Imaginea de mai jos prezintă părțile principale 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 captura în încercarea de a salva situația. Clasă Eroare, pe de altă parte, este pentru a indica erori serioase în mediul Java Run-time pe care aplicațiile nu ar trebui să îl captureze. Câteva exemple sunt: OutOfMemoryError și StackOverflowError.

Un Excepție din nou, este de două tipuri: verificate și necontrolate. O excepție verificată trebuie să fie gestionată de codul de apelare. Această regulă este impusă de compilamentul java. O excepție necontrolată, pe de altă parte, poate fi propagată în lanțul de apeluri fără a fi nevoie să o declarați în mod explicit. Exemplele de mai jos se vor clarifica.

Excepții verificate

Următoarea metodă încearcă să se creeze FileReader dintr-un fișier. Constructorul aruncă o excepție verificată FileNotFoundException care trebuie să fie manipulate de codul de apel sau declarate a fi aruncate.

Următorul cod va nu compilați, deoarece nici nu.

private void loadFile (numele fișierului șir) FileReader in = new FileReader (nume fișier);  

O modalitate de a obține codul pentru a compila este de a face față excepției (a se vedea mai jos).

private void loadFile (numele fișierului de șir) try FileReader în = noul FileReader (nume de fișier));  captură (FileNotFoundException ex) // face excepție aici 

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

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

Excepții necontrolate

O excepție neconfirmată este cea care este subclasată de la RuntimeException și nu trebuie să fie manipulate direct sau declarate ca mai sus. De exemplu, următorul cod are ca rezultat a NullPointerException, care este un tip de RuntimeException. Codul, cu toate acestea, compilează fără eroare de atunci NullPointerException este o excepție neconfirmată.

privid void handleEvent () Numele șirului = null; dacă name.length ()> 0)  

Excepții de ambalare

Având în vedere discuția de mai sus despre excepțiile verificate și necontrolate, se pare că este mai ușor să se facă față excepțiilor necontrolate, deoarece nu trebuie să le declarați sau să le ocupați de ele însele. Având în vedere această oportunitate, uneori este util să înfășurați o excepție verificată într-o excepție neconfirmată.

Următorul exempl de cod arată modul în care se poate încheia o excepție. Metoda method_1 () aruncă o SQLException în corpul său. Pentru ca codul să se compileze corect, excepția trebuie declarată a fi aruncată.

private void method_1 () aruncă SQLException ... arunca noi SQLException;  

Atunci când această metodă este invocată dintr-o altă metodă (method_2 ()), această metodă poate prinde SQLException și o înfășurați în interiorul unei excepții necontrolate, deci nu trebuie să declare excepția în semnătura metodei.

private void method_2 () încercați method_1 ();  captura (java.sql.SQLException ex) arunca noua RuntimeException (ex);  

Traseu cu stive de excepție

O trasare de stive de excepție se referă la seria de cadre active de stivă, fiecare reprezentând o invocare de metode, capturată de JVM în momentul în care a fost aruncată excepția. Fiecare cadru de stivă include locația invocării metodei, inclusiv numele clasei, numele metodei și, posibil, numele fișierului sursă java și numărul liniei din fișier. Este util pentru urmărirea secvenței de apeluri care au provocat eroarea Excepții Java: Îi manipulezi corect? Excepții Java: Îi manipulezi corect? O excepție în programare înseamnă o condiție excepțională în execuția programului. Este folosit atunci când condiția poate fi tratată mai bine în altă parte. Luați în considerare următoarele exemple de manipulare a excepțiilor Java. Citeste mai mult .

Aici este o urmă de stivă obișnuită, obținută din obiectul excepțional când a fost prins.

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

Excepția prinsă aici este IndexOutOfBoundsException. Acesta include informații suplimentare despre eroare. Trasul de stivă conține 3 cadre de stivă, fiecare dintre acestea cuprinzând informațiile despre locație, după cum se arată.

Manipularea excepțiilor

O excepție poate fi tratată prin prinderea acesteia într-o încearcă să prinzi blocarea și luarea măsurilor corective necesare. Excepție Obiectul oferă mai multe metode de extragere a informațiilor despre starea care a cauzat aceasta.

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

private void loadConfig () try // invoca codul care ar putea genera o captură IOException (java.io.IOException ex) // face excepție aici. Poate fi conectat la un fișier jurnal. log.warning (ex.getMessage ());  

Atunci când o excepție este înfășurată în interiorul celeilalte, puteți să recuperați excepția înfășurată:

Argument care poate fi aruncat = ex.getCause (); log.warning ("Cauza principală:" + cause.getMessage ()); 

Trebuie să accesați următoarea stivă și poate extrage numele metodei care a cauzat-o?

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

Sau poate, înregistrați excepția și răsturnați-o?

încercați ... captura (java.io.IOException ex) log.warning (ex.getMessage ()); arunca ex;  

Excepție clasa oferă o printStackTrace () metodă care poate imprima urmărirea stivei pe cont propriu PrintStream (sau PrintWriter).

încercați ... captura (java.io.IOException ex) PrintStream out = ...; out.println (ex.getMessage ()); ex.printStackTrace (out);  

Puteți să prindeți mai multe tipuri de excepții într-un singur exemplar încerca blocați și efectuați o manipulare specifică pentru fiecare tip de excepție.

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

Pentru a captura mai multe tipuri de excepții, 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 captura (java.io.IOException | java.sql.SQLException ex) // IOException și manipularea specifică SQLException aici captura (SAXException ex) // manipulare specifică SAXException aici 

Curățați resursele până la sfârșit

În cazul în care aveți de a face cu un cod care poate arunca excepții, este esențial să efectuați curățarea corespunzătoare a oricăror resurse, cum ar fi fișierele deschise Tot ce trebuie să știți despre formatele de fișiere și proprietățile lor Tot ce trebuie să știți despre formatele de fișiere și proprietățile acestora Utilizăm cuvântul fișier interschimbabil: muzică, imagine, foaie de calcul, prezentare de diapozitive și așa mai departe. Dar ceea ce face un fișier un "fișier", oricum? Să încercăm să înțelegem această parte fundamentală a calculului. Citiți mai multe, conexiunile bazei de date, etc. Curățarea resurselor ar trebui să fie efectuată într-o in cele din urma bloc. Astfel, atât ieșirea normală cât și ieșirea excepțională dintr-un bloc invocă codul de curățare Cele mai grele 10 greșeli de programare din istorie Cele mai grele 10 greșeli de programare din istorie În trecutul său trecut, codificarea distrugerii lucrate. Instanțele unui pic de 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ți ... in = fișierul FileInputStream nou (nume fișier); ... captură (java.io.IOException ex) log.warning (ex.getMessage ());  în cele din urmă // cod aici este executat la ieșirea din blocul try, // dacă în mod normal sau din cauza unei excepții dacă (in! = null) in.close ();  

Try-With-Resources Block

Java 1.7 a introdus încercați-cu-resurse construi ceea ce ușurează curățarea resurselor. Se pare ca aceasta:

încercați (InputStream in = new FileInputStream (...)) // codul care utilizează InputStream.  

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

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

încercați (InputStream in = new FileInputStream (...); Conexiune con = ...;) // cod care folosește InputStream și Connection.  

Orice obiect a cărui clasă implementează AutoCloseable interfața poate fi curățată în acest mod. Următoarea clasă efectuează o anumită curățare specifică în închide() metodă.

clasa publica MyClass implementează AutoCloseable public void close () // code cleanup here 

Utilizați o instanță a acestei clase într-un încercați-cu-resurse bloc.

încercați (MyClass obj = new MyClass (...)) // codul care utilizează obiectul MyClass.  

Unele excepții întâlnite frecvent

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

  • IndexOutOfBoundsException (neconfirmat): indică faptul că indexul elementului accesat este în afara limitelor unui șir, șir, etc.
  • SQLException (verificat): aruncat din cauza unei erori de bază de date.
  • IOException (verificat): eroare de acces la fișier sau erori care au legătură cu intrarea și ieșirea.
  • InterruptedException (verificat): aruncat atunci când execuția firului este întreruptă.
  • SAXException (verificat): aruncat din cauza erorilor de parsing XML.
  • NullPointerException (neconfirmat): folosind null unde este necesar un obiect.

Înfășurarea în sus

Excepțiile sunt principala metodă de raportare și gestionare a erorilor în Java. Utilizarea corectă a excepțiilor sporește calitatea codului Scrieți sau codificați mai repede în Editorul dvs. de text Linux Cu teme personalizate Scrieți sau codificați mai repede în Editorul dvs. de text Linux cu teme personalizate Editorul dvs. de text Linux nu trebuie să arate ciudat și "funcțional". De ce să nu-l optimizați pentru a-ți spori productivitatea, dacă scripturile și codarea sau folosiți instrumentul ca editor de marcare? Citește mai mult și ajută la rezolvarea problemelor din producție.

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

Credit de imagine: Dmitry Nikolaev prin Shutterstock.com

Explorați mai multe despre: Java, Programare.