3. Excepții de împachetare

Excepțiile bifate păreau cool în teorie, dar s-au dovedit a fi o mare frustrare în practică.

Să presupunem că aveți o metodă super populară în proiectul dvs. Este apelat din sute de locuri din programul dvs. Și decideți să adăugați o nouă excepție bifată . Și se poate ca această excepție verificată să fie cu adevărat importantă și atât de specială încât numai main()metoda știe ce să facă dacă este prinsă.

Aceasta înseamnă că va trebui să adăugați excepția bifată la throwsclauza fiecărei metode care vă numește metoda super populară . La fel ca și în throwsclauza tuturor metodelor care apelează acele metode. Și a metodelor care numesc acele metode.

Ca urmare, throwsclauzele a jumătate dintre metodele din proiect primesc o nouă excepție verificată . Și, desigur, proiectul tău este acoperit de teste, iar acum testele nu se compilează. Și acum trebuie să editați și clauzele throws din testele dvs.

Și apoi tot codul tău (toate modificările din sute de fișiere) va trebui să fie revizuit de alți programatori. Și în acest moment ne întrebăm de ce am făcut am făcut atâtea schimbări sângeroase în proiect? Zilele de lucru și testele întrerupte - toate de dragul de a adăuga o excepție verificată ?

Și, bineînțeles, există încă probleme legate de moștenire și suprascrierea metodei. Problemele care provin din excepțiile verificate sunt mult mai mari decât beneficiul. Concluzia este că acum puțini oameni le iubesc și puțini le folosesc.

Cu toate acestea, există încă o mulțime de cod (inclusiv cod standard de bibliotecă Java) care conține aceste excepții verificate . Ce e de făcut cu ele? Nu le putem ignora și nu știm cum să le gestionăm.

Programatorii Java au propus să încapsuleze excepțiile verificateRuntimeException în . Cu alte cuvinte, prindeți toate excepțiile verificate și apoi creați excepții nebifate (de exemplu, RuntimeException) și aruncați-le în schimb. Făcând asta arată cam așa:

try
{
   // Code where a checked exception might occur
}
catch(Exception exp)
{
   throw new RuntimeException(exp);
}

Nu este o soluție foarte frumoasă, dar nu este nimic criminal aici: excepția a fost pur și simplu îndesată într-un RuntimeException.

Dacă doriți, îl puteți recupera cu ușurință de acolo. Exemplu:

Cod Notă
try
{
   // Code where we wrap the checked exception
   // in a RuntimeException
}
catch(RuntimeException e)
{
   Throwable cause = e.getCause();
   if (cause instanceof Exception)
   {
      Exception exp = (Exception) cause;
      // Exception handling code goes here
   }
}







Obțineți excepția stocată în interiorul RuntimeExceptionobiectului. Variabila causepoate null

să-și determine tipul și să o convertească într-un tip de excepție verificat .