Metode care generează excepții

Instrucțiunea throw

Cunoaștem deja că, la apariția anumitor anomalii în executarea programului, mașina virtuală Java generează excepții. Excepțiile sunt obiecte din clasa Exception s-au dintr-o subclasă  a acesteia. Este posibil ca programatorul să prevadă, în anumite puncte ale programului, generarea unor excepții, folosind în acest scop instrucțiunea throw, care are forma următoare:

    throw new ConstructorExceptie(lista_argumente);

În limba engleză, throw este imperativul de la "a arunca".  În această instrucțiune, se folosește operatorul new pentru a genera un obiect al clasei de excepții căreia îi aparține constructorul invocat, după care acest obiect este "aruncat", fie pentru a fi "prins" (captat) printr-o structura try .. catch și  tratat prin program, fie pentru a fi preluat de mașina virtuală Java care, în acest caz, oprește execuția programului.

Exemplu
Instrucțiunea

 if(a>1000) throw new Exception("Exceptie 102: a="+a);

"aruncă" o excepție din clasa Exception, care contine un mesaj sub forma argumentului furnizat constructorului.

Clauza throws

În mod normal, excepțiile generate într-o metodă sunt tratate prin structuri try .. catch. chiar în metoda în care au fost generate. Este însă posibil ca metoda respectivă să "arunce" mai departe excepțiile generate în corpul ei. Pentru a indica această proprietate, la declararea metodei, după paranteza care conține lista declarațiilor argumentelor formale se pune clauza throwsClasaDeExceptii, în care se indică numele clasei excepției care este "aruncată" către metoda invocatoare (Cuvantul throws este persoana a treia singular a verbului to throw, "a arunca").

Exemplu

În programul din fișierul TestExceptie.java există metoda static int factorial(int n), care calculează factorialul argumentului n. În această metodă este folosită instrucțiunea throw de doua ori: pentru cazul în care argumentul este negativ și pentru cel în care argumentul este prea mare (rezultatul depășește valoarea maximă pentru tipul int al valorii întoarse). În ambele cazuri, în instrucțiunea throw se folosește constructorul clasei Exception, furnizându-i ca argument un mesaj care arată ce eroare s-a produs. Întrucat aceste excepții nu sunt tratate în metoda factorial, în declarația  metodei factorial s-a folosit clauza throws. În metoda main se captează și se afișează atât aceste excepții, cât și excepția NumberFormatException generată de metoda int Integer.parseInt(String s) atunci când argumentul acesteia nu este forma externă a unui număr întreg.
 
/* Testarea unei metode care genereaza exceptii.

   Lansarea in executie a aplicatiei se face prin comanda:
     java TestExceptie <numar_intreg>
   Daca <numar_intreg> este un numar intreg cuprins intre 0 si 12
   se afiseaza factorialul acestui numar. Altfel, se afiseaza un 
   mesaj de eroare
*/

class TestExceptie {

  /* O metoda in care se genereaza exceptii prin clauza throw */

  static int factorial(int n) throws Exception {
    if(n<0) throw new Exception("factorial: argument negativ n="+n);
    if(n>12) throw new Exception("factorial: argument prea mare: "+n);
    int fact=1;
    for(int k=1; k<=n; k++) fact*=k;
    return fact;
  }

  /* In metoda main se capteaza si trateaza exceptiile generate de
     metodele factorial si parseInt
  */
  public static void main(String args[]) {
    if(args.length==0) {
      System.out.println("Lipsa argument in linia de comanda");
      System.exit(1);
    }
    try {
      int n=Integer.parseInt(args[0]);
      int m=factorial(n);
      System.out.println("Factorialul lui "+n+" este "+m);
    }
    catch(Exception e) {
      System.out.println(e);
    }
  }
}



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați