This shows you the differences between two versions of the page.
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 ==== |