This shows you the differences between two versions of the page.
poo-ca-cd:laboratoare:exceptii [2020/10/04 11:50] amalia.palaghiu [Introducere] |
poo-ca-cd:laboratoare:exceptii [2023/01/16 08:15] (current) ioana_theodora.popa [Exerciţii] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Excepții ===== | + | ===== Laboratorul 12: Excepții ===== |
+ | |||
+ | **Video introductiv:** [[https://youtu.be/WhoDX_wkkhM | link]] | ||
==== Obiective ==== | ==== Obiective ==== | ||
Line 308: | Line 310: | ||
Într-o variantă a modelului standard al lanțului de responsabilitate, un handler poate acționa ca un [[:poo-ca-cd:laboratoare:tutorial-doubledispatch|dispatcher]], capabil să trimită comenzi în diverse direcții, formând un arbore de responsabilități (tree of responsibility). În unele cazuri, acest lucru poate apărea recursiv, cu procesarea obiectelor care apelează obiecte de procesare de nivel superior cu comenzi care încearcă să rezolve o parte mai mică a problemei; în acest caz, recurența continuă până când comanda este procesată, sau întregul arbore a fost explorat. Un interpretor XML ar putea funcționa în acest mod. | Într-o variantă a modelului standard al lanțului de responsabilitate, un handler poate acționa ca un [[:poo-ca-cd:laboratoare:tutorial-doubledispatch|dispatcher]], capabil să trimită comenzi în diverse direcții, formând un arbore de responsabilități (tree of responsibility). În unele cazuri, acest lucru poate apărea recursiv, cu procesarea obiectelor care apelează obiecte de procesare de nivel superior cu comenzi care încearcă să rezolve o parte mai mică a problemei; în acest caz, recurența continuă până când comanda este procesată, sau întregul arbore a fost explorat. Un interpretor XML ar putea funcționa în acest mod. | ||
- | |||
- | Modelul lanțului de responsabilitate este aproape identic cu modelul decoratorului, diferența fiind că pentru decorator, toate clasele se ocupă de cerere, iar pentru lanțul de responsabilitate, exact una dintre clasele din lanț se ocupă de cerere. | ||
==== Exerciţii ==== | ==== Exerciţii ==== | ||
- | - **(2p)** Citiți de la **stdin** o linie de text și afișați-o la **stdout** folosind BufferedReader-ul definit în schelet. Nu uitați să afișați un mesaj sugestiv în cazul apariției unei excepții și să închideți resursa după terminarea folosirii acesteia. Folosiți construcția ''try-with-resources'' sau ''try-catch-finally''. | + | - **(5p)** Definiţi o clasă care să implementeze operaţii pe numere **double**. Operaţiile vor arunca excepţii. Clasa va trebui să implementeze interfața ''Calculator'', ce conţine trei metode: |
- | - **(3p)** Definiţi o clasă care să implementeze operaţii pe numere **double**. Operaţiile vor arunca excepţii. Clasa va trebui să implementeze interfața ''Calculator'', ce conţine trei metode: | + | |
* ''add'': primeşte două numere şi întoarce un ''double'' | * ''add'': primeşte două numere şi întoarce un ''double'' | ||
* ''divide'': primeşte două numere şi întoarce un ''double'' | * ''divide'': primeşte două numere şi întoarce un ''double'' | ||
Line 322: | Line 321: | ||
* ''UnderflowException'': este aruncată dacă suma a două numere e egală cu ''Double.NEGATIVE_INFINITY''. | * ''UnderflowException'': este aruncată dacă suma a două numere e egală cu ''Double.NEGATIVE_INFINITY''. | ||
* Completați metoda ''main'' din clasa ''MainEx2'', evidențiind prin teste toate cazurile posibile care generează excepţii. | * Completați metoda ''main'' din clasa ''MainEx2'', evidențiind prin teste toate cazurile posibile care generează excepţii. | ||
- | - **(1p)** Care este alegerea firească pentru exercițiul trecut: excepţii **checked** sau **unchecked**? De ce? Consideraţi că, pentru un utilizator care doreşte efectuarea de operaţii aritmetice, **singurul** mecanism disponibil este cel oferit de clasa ''Calculator''. Discutați cu asistentul. | + | - **(5p)** Dorim să implementăm un ''Logger'' pe baza pattern-ului Chain-of-responsibility, definit mai sus, pe care îl vom folosi să păstram un jurnal de evenimente al unui program (vezi adaptarea în Referințe): |
- | - **(4p)** Dorim să implementăm un ''Logger'' pe baza pattern-ului Chain-of-responsibility, definit mai sus, pe care îl vom folosi să păstram un jurnal de evenimente al unui program (vezi adaptarea în Referințe): | + | |
- **(1p)** Creați enumerația ''LogLevel'', ce va acționa ca un [[https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html|bitwise flag]], care va conține valorile - ''Info, Debug, Warning, Error, FunctionalMessage, FunctionalError''. Această enumerație va expune și o metodă statică ''all()'' care va întoarce o colecție de ''EnumSet<LogLevel>'' în care vor fi toate valorile de mai sus (Hint: ''EnumSet.allOf()''). [[https://www.geeksforgeeks.org/enumset-class-java/|Exemplu]] practic de folosire. | - **(1p)** Creați enumerația ''LogLevel'', ce va acționa ca un [[https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html|bitwise flag]], care va conține valorile - ''Info, Debug, Warning, Error, FunctionalMessage, FunctionalError''. Această enumerație va expune și o metodă statică ''all()'' care va întoarce o colecție de ''EnumSet<LogLevel>'' în care vor fi toate valorile de mai sus (Hint: ''EnumSet.allOf()''). [[https://www.geeksforgeeks.org/enumset-class-java/|Exemplu]] practic de folosire. | ||
- **(1p)** Creați o clasă abstractă ''LoggerBase'': | - **(1p)** Creați o clasă abstractă ''LoggerBase'': | ||
Line 331: | Line 329: | ||
- va defini o metodă abstractă protected ''writeMessage'' ce va primi mesajul care trebuie afișat | - va defini o metodă abstractă protected ''writeMessage'' ce va primi mesajul care trebuie afișat | ||
- va expune o metodă publică ''message'' ce va primi mesajul care trebuie afișat și o severitate de tip ''LogLevel''. Dacă instanța de logger conține această severitate în colecția primită în constructor, atunci se va apela metoda ''writeMessage''. Apoi se vor pasa mesajul și severitatea către următorul delegat din lista de responsabilitate (dacă există unul) | - va expune o metodă publică ''message'' ce va primi mesajul care trebuie afișat și o severitate de tip ''LogLevel''. Dacă instanța de logger conține această severitate în colecția primită în constructor, atunci se va apela metoda ''writeMessage''. Apoi se vor pasa mesajul și severitatea către următorul delegat din lista de responsabilitate (dacă există unul) | ||
- | - **(2p)** Definiți clasele de mai jos care vor extinde ''LoggerBase'' și implementa metoda ''writeMessage'': | + | - **(3p)** Definiți clasele de mai jos care vor extinde ''LoggerBase'' și implementa metoda ''writeMessage'': |
- ConsoleLogger - care va scrie toate tipurile de ''LogLevel'' (Hint: ''all()'') și va prefixa mesajele cu ''[Console] '' | - ConsoleLogger - care va scrie toate tipurile de ''LogLevel'' (Hint: ''all()'') și va prefixa mesajele cu ''[Console] '' | ||
- EmailLogger - care va scrie doar tipurile ''FunctionalMessage'' și ''FunctionalError'' și va prefixa mesajele cu ''[Email] '' | - EmailLogger - care va scrie doar tipurile ''FunctionalMessage'' și ''FunctionalError'' și va prefixa mesajele cu ''[Email] '' | ||
Line 337: | Line 335: | ||
- Hint: ''EnumSet.of()'' | - Hint: ''EnumSet.of()'' | ||
- Completați cele 2 **TODO**-uri rămase în metoda ''main'' din clasa ''MainEx4''. | - Completați cele 2 **TODO**-uri rămase în metoda ''main'' din clasa ''MainEx4''. | ||
- | |||
- | ==== Resurse ==== | ||
- | |||
- | * {{poo-ca-cd:laboratoare:exceptii:skel-lab-exceptii.zip|Schelet}} | ||
- | * <html><a class="media mediafile mf_pdf" href="/poo/laboratoare/exceptii?do=export_pdf">PDF laborator</a></html> | ||