Cum să se ocupe de excepțiile Java pe calea cea bună
Ca un programator newbie Cum să înveți programarea fără toate stresul Cum să înveți programarea fără toate stresul Poate că ați decis să urmeze programare, fie pentru o carieră sau doar ca un hobby. Grozav! Dar poate că începi să te simți copleșit. Nu prea grozav. Iată ajutorul pentru a vă ușura călătoria. Citește mai mult, conceptul de tratarea excepțiilor poate fi greu să-ți înfășeri capul în jurul tău. Nu că conceptul în sine este dificil, dar terminologia o poate face să pară mai avansată decât este. Și este o caracteristică atât de puternică încât este predispusă să abuzeze și să abuzeze.
În acest articol, veți afla ce excepții sunt, de ce sunt importante, cum să le utilizați și greșeli comune de evitat. Majoritatea limbilor moderne 6 Limbile de programare cele mai ușoare de învățat pentru începători 6 cele mai ușoare limbi de programare pentru a învăța pentru începători Învățarea programării vizează găsirea limbii potrivite la fel de mult ca și procesul de edificare. Iată primele șase limbi de programare cele mai bune pentru începători. Citește mai multe au un fel de tratare a excepțiilor, deci dacă te deplasezi mereu de la Java 7 Trucuri utile pentru mastering un limbaj de programare nou 7 Trucuri utile pentru mastering un nou limbaj de programare Este bine să fii coplesit când înveți să codzi. Probabil veți uita lucrurile cât de repede le veți învăța. Aceste sfaturi vă pot ajuta să păstrați mai bine toate informațiile noi. Citiți mai multe, puteți lua majoritatea acestor sfaturi împreună cu dvs..
Înțelegerea excepțiilor Java
În Java, un excepție este un obiect care indică ceva anormal (sau “excepţional”) au apărut în timpul executării aplicației. Astfel de excepții sunt aruncat, care înseamnă în esență că este creat un obiect excepțional (similar cu modul în care sunt prezente erorile) “ridicat”).
Frumusețea este că poți captură aruncate excepții, ceea ce vă permite să vă ocupați de starea anormală și să permiteți aplicației dvs. să continue să funcționeze ca și când nu s-ar întâmpla nimic în neregulă. De exemplu, în timp ce un pointer nul în C ar putea să vă prăbușească aplicația, Java vă permite să aruncați și să prindeți NullPointerException
s înainte de o variabilă nulă are șansa de a provoca un accident.
Amintiți-vă, o excepție este doar un obiect, dar cu o caracteristică importantă: trebuie extinsă din Excepție
clasa sau orice subclasă de Excepție
. În timp ce Java are tot felul de excepții încorporate, puteți să vă creați și dvs. dacă doriți. Unele dintre cele mai comune excepții Java includ:
NullPointerException
NumberFormatException
IllegalArgumentException
RuntimeException
IllegalStateException
Deci, ce se întâmplă atunci când arunci o excepție?
În primul rând, Java se uită la metoda imediată pentru a vedea dacă există cod care gestionează tipul de excepție pe care ați aruncat-o. Dacă un manipulator nu există, se uită la metoda care a apelat metoda curentă pentru a vedea dacă există un mâner acolo. Dacă nu, se uită la metoda care a apelat acea metoda, apoi următoarea metodă etc. Dacă excepția nu este capturată, aplicația imprimă o urmă de stivă și apoi se prăbușește. (De fapt, este mai nuanțată decât pur și simplu crashing, dar acesta este un subiect avansat dincolo de domeniul de aplicare al acestui articol.)
A stivă urmă este o listă a tuturor metodelor pe care Java a traversat în timp ce căuta un handler de excepții. Iată ce arată următoarea stivă:
Excepție în firul "principal" java.lang.NullPointerException la com.example.myproject.Book.getTitle (Book.java:16) la com.example.myproject.Author.getBookTitles (Author.java:25) la com.example. myproject.Bootstrap.main (Bootstrap.java:14)
Putem să strângem din asta. În primul rând, excepția aruncată a fost a NullPointerException
. A apărut în getTitle ()
pe linia 16 din Book.java. Această metodă a fost chemată de la getBookTitles ()
pe linia 25 a autorului.java. Acea metoda a fost chemată de la principal()
pe linia 14 a Bootstrap.java. După cum puteți vedea, cunoașterea tuturor acestor lucruri face ca depanarea să fie mai ușoară.
Dar din nou, adevăratul beneficiu al excepțiilor este că puteți “mâner” starea anormală prin prinderea excepției, stabilirea lucrurilor și reluarea aplicației fără crashing.
Utilizarea excepțiilor Java în cod
Să spunem că ai făcut-o SomeMethod ()
care ia un număr întreg și execută o anumită logică care s-ar putea rupe dacă întregul este mai mic de 0 sau mai mare de 100. Acesta ar putea fi un loc bun pentru a arunca o excepție:
public void someMethod (valoare int) if (valoare < 0 || value > 100) aruncați noi IllegalArgumentException
(); // ...
Pentru a prinde această excepție, trebuie să te duci acolo SomeMethod ()
este numit și utilizează încercați-captura bloc:
public void callingMethod () încercați someMethod (200); someOtherMethod (); captură (IllegalArgumentException e) // manipulați excepția aici // ...
Totul în interiorul încerca bloc va executa în ordine până la o excepție este aruncat. De îndată ce o excepție este aruncată, toate instrucțiunile ulterioare sunt ignorate și logica aplicației urcă imediat la captură bloc.
În exemplul nostru, introducem blocul de încercare și sunăm imediat SomeMethod ()
. Din moment ce 200 nu este între 0 și 100, un IllegalArgumentException
este aruncat. Aceasta termină imediat executarea SomeMethod ()
, ignoră restul logicii din blocul de încercare (someOtherMethod ()
nu este chemat) și reia execuția în blocul de captură.
Ce s-ar întâmpla dacă am sunat SomeMethod (50)
in schimb? IllegalArgumentException
nu ar fi aruncat niciodată. SomeMethod ()
ar executa ca normal. Blocul de încercare s-ar executa în mod normal, apelând someOtherMethod ()
când unele Metoda () completează. Cand someOtherMethod ()
capăt, blocul de captură va fi sărit și callingMethod ()
ar continua.
Rețineți că puteți avea mai multe blocuri de captură pe bloc de încercare:
public void callingMethod () încercați someMethod (200); someOtherMethod (); captură (IllegalArgumentException e) // manipulați excepția de aici captură (NullPointerException e) // manipulați excepția aici // ...
De asemenea, rețineți că un opțional in cele din urma există și blocul:
public void method () try // ... captură (excepție e) // ... în cele din urmă // ...
Codul într-un bloc final este mereu executat indiferent de ce. Dacă aveți o declarație de returnare în blocul de încercare, blocul final este executat înainte de a reveni la metodă. Dacă aruncați o altă excepție în blocul de captură, blocul final este executat înainte ca excepția să fie aruncată.
Ar trebui să utilizați blocul final atunci când aveți obiecte care trebuie curățate înainte ca metoda să se termine. De exemplu, dacă ați deschis un fișier în blocul de încercare și mai târziu ați aruncat o excepție, blocul final vă permite să închideți fișierul înainte de a părăsi metoda.
Rețineți că puteți avea un bloc în cele din urmă fără un bloc de captură:
metoda void public () try // ... în cele din urmă // ...
Acest lucru vă permite să efectuați orice curățare necesară, permițând în același timp excepțiile aruncate să propagați stiva de invocare a metodei (adică nu doriți să rezolvați excepția aici, dar mai trebuie să curățați mai întâi).
Verificate vs. excepții necontrolate în Java
Spre deosebire de majoritatea limbilor, Java face distincția între verificați excepțiile și excepții necontrolate (de exemplu, C # are excepții necontrolate). O excepție verificată trebuie sa să fie prins în metoda în care excepția este aruncată sau altfel codul nu se va compila.
Pentru a crea o excepție verificată, extindeți de la Excepție
. Pentru a crea o excepție neconfirmată, extindeți de la RuntimeException
.
Orice metodă care aruncă o excepție verificată trebuie să indice acest lucru în semnătura metodei utilizând aruncă cuvinte cheie. Deoarece Java-ul a fost încorporat IOException
este o excepție verificată, următorul cod nu va fi compilat:
public void wontCompile () // ... dacă (someCondition) arunca noua IOException (); // ...
Mai întâi trebuie să declarați că aruncă o excepție verificată:
void public vaCompile () arunca IOException // ... if (someCondition) arunca noua IOException (); // ...
Rețineți că o metodă poate fi declarată ca aruncând o excepție, dar niciodată nu aruncați o excepție. Chiar și așa, excepția va trebui încă să fie capturată sau altfel codul nu va fi compilat.
Când trebuie să utilizați excepții verificate sau necontrolate?
Documentația oficială Java are o pagină cu această întrebare. Rezumă diferența printr-o regulă succintă: “Dacă se poate aștepta în mod rezonabil ca un client să se recupereze de la o excepție, face o excepție verificată. Dacă un client nu poate face nimic pentru a recupera de la excepție, face o excepție neconfirmată.”
Dar această orientare poate fi depășită. Pe de o parte, excepțiile verificate nu conduc la un cod mai robust. 10 Sfaturi pentru scriere mai curată și un cod mai bun 10 Sfaturi pentru scriere mai curată și cod mai bun Codul curat pare mai ușor decât este de fapt, dar beneficiile merită. Iată cum puteți începe să scrieți un cod mai curat astăzi. Citeste mai mult . Pe de altă parte, nici o altă limbă nu a verificat excepțiile în același mod ca Java, ceea ce arată două lucruri: una, caracteristica nu este suficient de utilă pentru ca alte limbi să o fure, iar două, puteți trăi absolut fără ele. În plus, excepțiile verificate nu se joacă frumos cu expresiile lambda introduse în Java 8.
Linii directoare pentru utilizarea excepțiilor Java
Excepțiile sunt utile, dar ușor de utilizat și abuzate. Iată câteva sfaturi și cele mai bune practici pentru a vă ajuta să evitați să vă dezorientați.
- Preferi excepții specifice față de excepțiile generale. Utilizare
NumberFormatException
pesteIllegalArgumentException
atunci când este posibil, altfel utilizațiIllegalArgumentException
pesteRuntimeException
cand este posibil. - Nu prindeți niciodată
Dispensabil
!Excepție
clasa se extindeDispensabil
, iar blocul de captură funcționează cuDispensabil
sau orice clasă care se extinde. ÎnsăEroare
clasa se extindeDispensabil
, și niciodată nu vreți să prindeți unulEroare
deoareceEroare
s indică probleme grave de nerecuperat. - Nu prindeți niciodată
Excepție
!InterruptedException
extindeExcepție
, astfel încât orice bloc care capteazăExcepție
va prinde de asemeneaInterruptedException
, și aceasta este o excepție foarte importantă pe care nu doriți să o faceți (mai ales în aplicațiile cu mai multe fire), decât dacă știți ce faceți. Dacă nu știți ce excepție să faceți în loc, nu luați în considerare nimic. - Utilizați mesaje descriptive pentru a ușura depanarea. Când arunci o excepție, poți să oferi o
Şir
mesaj ca argument. Acest mesaj poate fi accesat în blocul de captură folosindException.getMessage ()
, dar dacă excepția nu este niciodată prinsă, mesajul va apărea, de asemenea, ca parte a traseului stivei. - Încercați să nu prindeți și ignorați excepțiile. Pentru a evita inconvenientele excepțiilor verificate, mulți începători și programatori leneși vor crea un bloc de captură, dar îl vor lăsa goale. Rău! Luați-o întotdeauna cu grație, dar dacă nu puteți, imprimați cel puțin o urmă de stivă, astfel încât să știți că excepția a fost aruncată. Puteți face acest lucru folosind
Exception.printStackTrace ()
metodă. - Feriți-vă de excepții excesive. Când ai un ciocan, totul arată ca un cui. Când aflați mai întâi despre excepții, vă puteți simți obligat să transformați totul într-o excepție ... până la punctul în care cea mai mare parte a fluxului de control al aplicației dvs. se reduce la tratarea excepțiilor. Amintiți-vă, excepțiile sunt menite pentru “excepţional” evenimente!
Acum ar trebui să fii destul de confortabil cu excepții pentru a înțelege ce sunt, de ce sunt folosite și cum să le încorporați în propriul cod. Dacă nu înțelegi pe deplin conceptul, e în regulă! Mi-a luat ceva timp pentru asta “clic” in capul meu, asa ca nu simti ca trebuie sa-l grabesti 6 Semne pe care nu ai de spus sa fii un programator 6 semne pe care nu ai de spus sa fii programator Nu toata lumea este taiata ca programator. Dacă nu sunteți sigur că sunteți menit să fii programator, iată câteva semne care vă pot îndruma în direcția cea bună. Citeste mai mult . Nu vă grăbiți.
Ai întrebări? Cunoașteți orice alte sfaturi legate de excepție pe care le-am pierdut? Trimiteți-le în comentariile de mai jos!
Explorați mai multe despre: Java.