Seminář 9
Témata
- Kolekce III
- Výjimky
Kolekce
- Java collection framework
- Obrázek se základními třídami a rozhraními souvisejícími s kolekcemi.
- Rozhraní Iterable.
- Rozhraní Collection.
- Rozhraní List.
- Rozhraní Set.
- Rozhraní Map.
- U všech odkazů výše si všimněte, že v dokumentaci (nahoře) jsou všechny kolekce, které dané rozhraní implementují, a další rozhraní, které jej rozšiřují. Doporučuji si to alespoň pročíst, abyste tušili, co je k dispozici.
- I pro kolekce je pěkný tutoriál.
- Podívejte se určitě na:
- List, ArrayList, LinkedList, Vector, Map, Stack, Queue, …
- BitSet
- TreeMap a TreeSet
- HashMap, Hashtable a HashSet
- SortedMap a SortedSet
- AbstractSet, AbstractCollection, AbstractList, AbstractQueue, …
- Mimo jiné umožnují vyřešit mnohé z minulých úkolů v pár řádcích kódu.
Výjimky
- Výjimky v Java tutoriálu.
- Událost signalizující, že výpočet neprobíhal tak, jak bylo zamýšleno.
- Přeruší výpočet a oznámí to volajícímu - ten může na situaci nějak reagovat, nebo přerušit svůj výpočet a oznámit to volajícímu atd.
- Příklady:
- soubor neexistuje, nebo nemáme právo zápisu;
- uživatelský vstup je neplatný;
- někdo zkoušel dělit nulou
- databáze není dostupná
- …
- Potomci třídy Exception. (Existuje i obecnější Throwable.)
- Error (kritické chyby) vs RuntimeException (programátorské chyby) vs Exception (neplatné stavy, na které má smysl reagovat)
- Ukázka použití.
Checked vs unchecked
- Checked exceptions - výjimky, které jsou součástí API balíčku/metod - klíčové slovo
throws
v hlavičce metody. - Unchecked exceptions - výjimky, které v API být nemusí (
RuntimeException
,Error
a jejich potomci). Typicky vážné věci, na které uživatel stejně nemá jak reagovat. Mohou být vyvolány kdekoliv. Např. IndexOutOfBoundsException, NullPointerException, …, VirtualMachineError, ThreadDeath, AssertionError, … - Kdy použít který typ? Záleží na situaci…
- Poučka: “Pokud s problémem volající může něco udělat, použijeme checked exception, ať může reagovat.”
Úkoly
- Implementuje jednoduchou RPN kalkulačku.
- Implementujte ji nejprve jako metodu
int rpnCalc(String expr)
, kde jako argument bude předaný výraz v postfixové notaci (např. “1 2 3 + +” nebo “1 32 + 42 * 5 + 66 -”) a na výstupu bude hodnota výrazu. Kalkulačka by měla fungovat následovně:- Výraz je rozložen na jednotlivé atomy a potom je procházen zleva doprava.
- Pokud je nejlevější prvek číslo, je jeho hodnota uložena na zásobník, je-li to operátor, jsou odebrány ze zásobníku dvě hodnoty a je provedena příslušná operace.
- Výsledná hodnota je uložena na zásobník.
- Zatím uvažujme pouze celá čísla a binární operace +, -, *, /.
- Rozšiřte předchozí úkol tak, aby metoda int
rpnCalc(String expr, Map <String, Integer> variables)
měla ještě jeden argument představující vazby proměnných. Pokud bude nalezen atom představující proměnnou, bude příslušná hodnota uložena na zásobník.
Např.1 foo +
přečte hodnotufoo
z argumentu variables, zvýší ji o jedna a vrátí výsledek. - Rozšiřte/upravte RPN kalkulačku tak, aby měla následující vlastnosti:
- Metoda by měla umět vyhodnocovat výrazy s celými čísly (např. 1, 12, -123) i s čísly s plovoucí řádovou čárkou (např. 1.0, 2.23, 45.56, -78.123). Pokud dojde k sečtení (odečtení, atd.) dvou čísel, kde jedno je číslo s plovoucí řádovou čárkou, výsledkem je číslo s plovoucí řádovou čárkou.
- Přidejte podporu pravdivostních hodnot reprezentovaných literály (
#t
,#f
) a přidejte operátory <, > =, !=, <=, >=, porovnávající čísla a pravdivostní hodnoty. Pokud hodnoty nejde porovnat, skončí metoda vyjímkou. - Přidejte ternární operátor
?
, který odebere z vrcholu zásobníku pravdivostní hodnotu a dvě další hodnoty. Pokud byla na vrcholu zásobníku hodnota#t
, vrátí druhou odebranou hodnotu, jinak vrátí třetí. Pokud na vrcholu zásobníku nebude pravdivostní hodnota, skončí metoda vyjímkou.
- Metoda by měla umět vyhodnocovat výrazy s celými čísly (např. 1, 12, -123) i s čísly s plovoucí řádovou čárkou (např. 1.0, 2.23, 45.56, -78.123). Pokud dojde k sečtení (odečtení, atd.) dvou čísel, kde jedno je číslo s plovoucí řádovou čárkou, výsledkem je číslo s plovoucí řádovou čárkou.
- Program napište tak, aby adekvátně ošetřil i další chybové stavy, např. dělení nulou, špatně zapsaný výraz, atd. a aby nebyl realizován jako jedna metoda, byl řádně rozčleněn a dokumentován.
- Výsledek odevzdejte emailem s předmětem jj1-09 na tomas.urbanec@upol.cz do 12.12.2023, 14:59 CEST. Odevzdávejte pouze zdrojové kódy, nikoliv celé projekty vygenerované IDE.
Příklady použití:
Výraz | Výsledek | Komentář |
---|---|---|
1.1 2 + |
3.1 |
|
1 2 + |
3 |
|
1 2 + 4 * 6 + |
18 |
(((1 + 2) * 4) + 6) |
1 foo + |
3 |
Pokud variables obsahují klíč foo s hodnotou 2 |
1.1 2 < |
#t |
|
#f #t < |
#t |
|
#f #t > |
#f |
|
1 foo + |
Exception |
Pokud variables neobsahují klíč foo |
1 #f = |
Exception |
Neporovnatelné hodnoty |
1 2 3 4 < ? |
2 |
|
1 2 3 4 + ? |
Exception |
7 není pravdivostní hodnota |
1 0 / |
Exception |
Dělení nulou |