This shows you the differences between two versions of the page.
poo:breviare:breviar-05 [2018/09/23 12:08] mihai.nan created |
poo:breviare:breviar-05 [2023/10/16 19:37] (current) carmen.odubasteanu |
||
---|---|---|---|
Line 1: | Line 1: | ||
==== Laboratorul 5 ==== | ==== Laboratorul 5 ==== | ||
+ | |||
=== Exceptii === | === Exceptii === | ||
Line 37: | Line 38: | ||
== Clauza throws == | == Clauza throws == | ||
- | Inca din primele laboratoare am spus ca obiecte interactioneaza prin apeluri de metoda. Din perspectiva unui obiect care apeleaza o metoda a unui alt obiect, la revenirea din respectivul apel putem fi in doua situatii: metoda s-a executat in mod obisnuit sau metoda s-a terminat in mod neobisnuit, datorita aparitiei unei exceptii. Clauza ''''''throws''''' apare in antetul unui metode si ne spune ce tipuri de exceptii pot conduce la **terminarea neobisnuita** a respectivei metode. Mai jos, vom prezenta modul in care specificam metodele clasei '''''SirNumere''''' care pot sa termine executia datorita unei situatii neobisnuite. | + | Inca din primele laboratoare am spus ca obiecte interactioneaza prin apeluri de metoda. Din perspectiva unui obiect care apeleaza o metoda a unui alt obiect, la revenirea din respectivul apel putem fi in doua situatii: metoda s-a executat in mod obisnuit sau metoda s-a terminat in mod neobisnuit, datorita aparitiei unei exceptii. Clauza **throws** apare in antetul unui metode si ne spune ce tipuri de exceptii pot conduce la **terminarea neobisnuita** a respectivei metode. Mai jos, vom prezenta modul in care specificam metodele clasei **SirNumere** care pot sa termine executia datorita unei situatii neobisnuite. |
<code java> | <code java> | ||
Line 56: | Line 57: | ||
- | Clauza '''''throws''''' poate fi vazuta ca o specificare suplimentara a tipului returnat de o metoda. De exemplu, metoda '''''sterge''''' returneaza, in mod obisnuit, o valoare de tip '''''int''''', reprezentand pozitia elementului sters. Clauza '''''throws''''' spune ca, in situatii exceptionale, metoda poate returna o referinta la un obiect de tip '''''ExceptieSirVid''''' sau o referinta la un obiect al carui tip reprezinta un subtip al acestei clase. | + | Clauza **throws** poate fi vazuta ca o specificare suplimentara a tipului returnat de o metoda. De exemplu, metoda **sterge** returneaza, in mod obisnuit, o valoare de tip **int**, reprezentand pozitia elementului sters. Clauza **throws** spune ca, in situatii exceptionale, metoda poate returna o referinta la un obiect de tip **ExceptieSirVid** sau o referinta la un obiect al carui tip reprezinta un subtip al acestei clase. |
<note important> | <note important> | ||
- | Este important de subliniat faptul ca dupa clauza '''''throws''''' se pot introduce mai multe nume de exceptii, separate prin virgula. | + | Este important de subliniat faptul ca dupa clauza **throws** se pot introduce mai multe nume de exceptii, separate prin virgula. |
</note> | </note> | ||
== Tratarea exceptiilor == | == Tratarea exceptiilor == | ||
- | Pana acum am vorbit despre modul de definire a unei exceptii si de modul in care specificam faptul ca o metoda poate sa se termine cu una sau mai multe exceptii. In continuare, ne vom ocupa de raspunsul urmatoarei intrebari: ,,Cum poate afla un obiect, folosit pentru apelul unei metode ce se poate termina cu una sau mai multe exceptii, daca apelul s-a terminat normal sau nu?''. Raspunsul este unui simplu, deoarece, evident, cei care au proiectat Java s-au gandit la o rezolvare pentru o astfel de situatie. Acest lucru se rezolva uzitand un bloc '''''try-catch-finaly''''', structura generala pentru un astfel de bloc fiind prezentata mai jos. | + | Pana acum am vorbit despre modul de definire a unei exceptii si de modul in care specificam faptul ca o metoda poate sa se termine cu una sau mai multe exceptii. In continuare, ne vom ocupa de raspunsul urmatoarei intrebari: ,,Cum poate afla un obiect, folosit pentru apelul unei metode ce se poate termina cu una sau mai multe exceptii, daca apelul s-a terminat normal sau nu?''. Raspunsul este unui simplu, deoarece, evident, cei care au proiectat Java s-au gandit la o rezolvare pentru o astfel de situatie. Acest lucru se rezolva uzitand un bloc **try-catch-finaly**, structura generala pentru un astfel de bloc fiind prezentata mai jos. |
<code java> | <code java> | ||
Line 92: | Line 93: | ||
<note important> | <note important> | ||
- | In sectiunea '''''try''''' se introduce codul pe parcursul caruia pot sa apara exceptii. In fiecare sectiune '''''catch''''' se amplaseaza secventa de intructiuni ce trebuie sa se execute in momentul in care sectiunea in '''''try''''' a aparut o exceptie de tipul parametrului sectiunii '''''catch''''' (sau un subtip). In sectiunea '''''finally''''', se amplaseaza cod ce trebuie neaparat sa se execute inaintea parasirii blocului '''''try-catch-finally''''', indiferent daca a aparut sau nu vreo exceptie (tratata sau netratata). | + | In sectiunea **try** se introduce codul pe parcursul caruia pot sa apara exceptii. In fiecare sectiune **catch** se amplaseaza secventa de intructiuni ce trebuie sa se execute in momentul in care sectiunea in **try** a aparut o exceptie de tipul parametrului sectiunii **catch** (sau un subtip). In sectiunea **finally**, se amplaseaza cod ce trebuie neaparat sa se execute inaintea parasirii blocului **try-catch-finally**, indiferent daca a aparut sau nu vreo exceptie (tratata sau netratata). |
</note> | </note> | ||
Line 98: | Line 99: | ||
== Emiterea explicita a exceptiilor == | == Emiterea explicita a exceptiilor == | ||
- | In aceasta sectiune vom vedea cum anume se anunta explicit aparitia unei situatii neobisnuite. Mai exact, vom vedea cum se emite explicit o exceptie. Acest lucru se va realiza uzitand instructiunea '''''throw'''''. | + | In aceasta sectiune vom vedea cum anume se anunta explicit aparitia unei situatii neobisnuite. Mai exact, vom vedea cum se emite explicit o exceptie. Acest lucru se va realiza uzitand instructiunea **throw**. |
Line 105: | Line 106: | ||
</note> | </note> | ||
- | In continuare, vom prezenta implementarea integrala a clasei '''''SirNumere''''', pentru o intelegere mai buna a conceptelor explicate in aceasta sectiune. | + | In continuare, vom prezenta implementarea integrala a clasei **SirNumere**, pentru o intelegere mai buna a conceptelor explicate in aceasta sectiune. |
<code java> | <code java> | ||
Line 167: | Line 168: | ||
- | Spre exemplu, vom considera un vector intrinsec, avand elemente de tip double si o capacitate de 10 elemente. In momentul in care vom incerca sa accesam un element folosind un index mai mare ca 9 sau mai mic ca 0, masina virtuala Java va emite o exceptie de tip '''''IndexOutOfBoundsException'''''. | + | Spre exemplu, vom considera un vector intrinsec, avand elemente de tip double si o capacitate de 10 elemente. In momentul in care vom incerca sa accesam un element folosind un index mai mare ca 9 sau mai mic ca 0, masina virtuala Java va emite o exceptie de tip **IndexOutOfBoundsException**. |
<code java> | <code java> | ||
Line 222: | Line 223: | ||
<note important> | <note important> | ||
- | **Blocurile statice de initilizare** sunt blocuri de cod care sunt executate **DOAR O DATA** atunci cand clasa este incarcata de Java Virtual Machine; acesta este motivul pentru care mesajul din blocul static de initializare este imprimat inainte de apelul metodei '''''main'''''. Aceste tipuri de blocuri de initializare sunt utile pentru initializarea atributelor statice din clase sau pentru a efectua o singura data un set de prelucrari. | + | **Blocurile statice de initilizare** sunt blocuri de cod care sunt executate **DOAR O DATA** atunci cand clasa este incarcata de Java Virtual Machine; acesta este motivul pentru care mesajul din blocul static de initializare este imprimat inainte de apelul metodei **main**. Aceste tipuri de blocuri de initializare sunt utile pentru initializarea atributelor statice din clase sau pentru a efectua o singura data un set de prelucrari. |
- | **Bocurile statice de initializare** pot accesa **DOAR** atributele statice ale clasei in care sunt definite. **NU** se pot folosi variabile de instanta in blocuri de initializare statice (daca incercati sa faceti acest lucru, veti primi o eroare de compilare: '''''non-static variable value cannot be referenced from a static context'''''). | + | **Bocurile statice de initializare** pot accesa **DOAR** atributele statice ale clasei in care sunt definite. **NU** se pot folosi variabile de instanta in blocuri de initializare statice (daca incercati sa faceti acest lucru, veti primi o eroare de compilare: **non-static variable value cannot be referenced from a static context**). |
</note> | </note> | ||
- | == Blocuri instanta de initializare | + | == Blocuri instanta de initializare == |
<note important> | <note important> |