Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-ca-cd:laboratoare:exceptii [2023/01/16 08:14]
ioana_theodora.popa [Exerciţii]
poo-ca-cd:laboratoare:exceptii [2024/01/14 19:22] (current)
aghiorghita [Exerciţii]
Line 312: Line 312:
  
 ==== Exerciţii ==== ==== Exerciţii ====
-  - **(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: +  - **(4p)**  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 ''​CalculatorBase'',​ 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''​ 
-    * ''​average'':​ primeşte o colecţie ce conţine obiecte ''​double'',​ şi întoarce media acestora ca un numar de tip ''​double''​. Pentru calculul mediei, sunt folosite metodele ''​add''​ şi ''​divide''​.+     ​ ''​average'':​ primeşte o colecţie ce conţine obiecte ''​double'',​ şi întoarce media acestora ca un numar de tip ''​double''​. ​ ​!! ​Pentru calculul mediei, sunt folosite metodele ''​add''​ şi ''​divide'' ​!! .
     * Metodele pot arunca următoarele excepții (definite în interfața ''​Calculator''​):​     * Metodele pot arunca următoarele excepții (definite în interfața ''​Calculator''​):​
       * ''​NullParameterException'':​ este aruncată dacă vreunul din parametrii primiți este ''​null'';​       * ''​NullParameterException'':​ este aruncată dacă vreunul din parametrii primiți este ''​null'';​
Line 321: 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.
-  - **(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)** Vom realiza o mini librărie online în care putem adăuga cărți cumpărându-le și din care putem să extragem o carte deja existentă. 
-    **(2p)** ​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+        - Definește clasa ''​Book''​ care are parametrii title, author, genre și price. 
-    **(1p)** ​Creați o clasă abstractă ''​LoggerBase'':​ +        - Definește două noi excepții care extind clasa Exception:​ 
-      ​- ​va primi în constructor un obiect de tip ''​EnumSet<​LogLevel>​'' ​care va defini pentru ce nivele de log se va afisa mesajul +          * ''​NotEnoughMoneyException'',​ care e aruncată atunci când utilizatorul nu are bani suficienți pentru a cumpăra o carte 
-      ​- ​va păstra o referință către următorul ​''​LoggerBase'' ​la care se trimite mesajul +          * ''​NoSuchBookException'',​ care e aruncată atunci când cartea dorită nu se găsește în librărie. 
-      ​- ​va expune o metodă publică ''​setNext''​ ce va primi un ''​LoggerBase'' ​și va seta următorul delegat din lista de responsabilitate +        - Definește clasa ''​OnlineLibrary''​ care are: 
-      ​- ​va defini o metodă abstractă protected ''​writeMessage''​ ce va primi mesajul care trebuie afișat +          * doi parametrii: o listă de cărți și bugetul utilizatorului 
-      ​- ​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) +          * un constructor care primește bugetul inițial al utilizatorului 
-    **(3p)** ​Definiți clasele de mai jos care vor extinde ​''​LoggerBase'' ​și implementa metoda ''​writeMessage''​+          * metodele: 
-      - ConsoleLogger ​- care va scrie toate tipurile de ''​LogLevel'' ​(Hint: ​''​all()''​) și va prefixa mesajele cu ''​[Console] ''​ +           * ''​addBook''​ - primește o carte și o adaugă în librărie dacă utilizatorul are fonduri suficiente 
-      ​- ​EmailLogger - care va scrie doar tipurile ​''​FunctionalMessage'' ​și ''​FunctionalError'' ​și va prefixa mesajele cu ''​[Email] ''​ +           * ''​getBook''​ - returnează cartea dorită, dacă aceasta se află în librărie. 
-      ​- ​FileLogger - care va scrie doar tipurile ​''​Warning'' ​și ''​Error'' ​și va prefixa mesajele cu ''​[File] ''​ +        - În metoda ''​Main''​ să se realizeze TODO-urile:​ 
-      - Hint: ''​EnumSet.of()''​ +            *''​TODO1''​ - adaugă lista de cărți în librărie 
-      ​- Completați cele 2 **TODO**-uri rămase în metoda ​''​main'' ​din clasa ''​MainEx4''​+            *''​TODO2''​ - ia cartea book4 din librărie. Dacă nu există, adaug-o. 
 +        * Atenție la tratarea excepțiilor! (A se afișa un mesaj corespunzător fiecărui caz, ca în exemplu). 
 +    - **(2p)** Dorim să implementăm un ''​Logger''​ pe baza pattern-ului Chain-of-responsibility,​ definit ​în laborator, pe care îl vom folosi să păstram un jurnal de evenimente al unui program: 
 +        - Creați enumerația ''​LogLevel'',​ ce va acționa ca un 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()''​). 
 +        - Creați o clasă abstractă ''​LoggerBase'' ​care
 +            ​* ​va primi în constructor un obiect de tip EnumSet<​LogLevel>​ care va defini pentru ce nivele de log se va afisa mesajul 
 +            ​* ​va păstra o referință către următorul LoggerBase la care se trimite mesajul 
 +            ​* ​va expune o metodă publică ''​setNext''​ ce va primi un LoggerBase și va seta următorul delegat din lista de responsabilitate 
 +            ​* ​va defini o metodă abstractă protected ''​writeMessage''​ ce va primi mesajul care trebuie afișat ​și afișează mesajul în cauză 
 +            ​* ​va expune o metodă publică ''​message''​ ce va primi mesajul care trebuie afișat și o severitate de tip LogLevel ​(adică Info, Debug, Warning, Error, FunctionalMessage sau FunctionalError). 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) 
 +        - 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]''​ 
 +            * ''​EmailLogger'' ​- care va scrie doar tipurile FunctionalMessage și FunctionalError și va prefixa mesajele cu ''​[Email]''​ 
 +            * ''​FileLogger'' ​- care va scrie doar tipurile Warning și Error și va prefixa mesajele cu ''​[File]''​ 
 +        - Completați cele 2 TODO-uri rămase în metoda main din clasa Main. (Hint: ​''​EnumSet.of()'' ​pentru constructori)
  
 ==== Referinţe ==== ==== Referinţe ====
poo-ca-cd/laboratoare/exceptii.1673849688.txt.gz · Last modified: 2023/01/16 08:14 by ioana_theodora.popa
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0