Seminář 7
Témata semináře
- Výjimky
- Enumy
- Optional
K úkolům
- Kvůli formulaci v podmínkách na webu (… do příštího semináře …) prodloužen termín minulého úkolu do 11.11.
Poznámky k řešením
equals() vs == (příklad se psem a páníčkem)
equals() a hashCode()
Primitivní typy a jejich objektové kontejnery (int/Integer, float/Float, …) Dokumentace
Autoboxing
- Předávání primitivní hodnoty metodě očekávající objektový konetjner.
- Přiřzování primitivní hodntoy do proměnné kontejnerového typu.
Unboxing
- Předávání objekotvého kontejneru metodě očekávající primitivní hodnotu.
- Přiřazování objektového kontejneru do proměnné očekávající primitivní hodnotu.
(Přesné) porovnávání floatů je špatný nápad. Při práci s nimi vznikají chyby v přesnosti.
jshell> float a = 0; a ==> 0.0 jshell> float b = 0; b ==> 0.0 jshell> for (int i = 1; i < 100; i++){ a += 10f/i;} jshell> for (int i = 99; i >= 1; i–){ b += 10f/i;} jshell> a a ==> 51.773777 jshell> b b ==> 51.77377 jshell> a == b $50 ==> false
Pro přesnou aritmetiku máme BigDecimal v Math. U floatů/doublů nezbývá než si dávat pozor, jak s nimi pracujete.
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říklad, soubor neexistuje, nebo nemáme právo zápisu; uživatelský vstup je neplatný; někdo zkoušel dělit nulou…
- 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 tím volající může něco udělat, použijeme checked exception, ať může reagovat. Pokud je to stav, na který se rozumně reagovat nedá, tak použijte některou z unchecked exceptions.”
Enumy (výčtové typy)
- Programátorem definovaný konečně-hodnotový datový typ.
- V Javě může mít každá hodnota enumu nějaké své vlastnosti.
- Můžeme přidat i metody.
- Nelze vytvářet nové instance. Tj instance jsou právě naše prvky výčtu.
- Nelze dědit.
- Lze přes ně iterovat (statická metoda values() vrátí všechny prvky enumu).
- Ukázka.
Optional
- Dokumentace
- Všeříkající citace: “Optional is primarily intended for use as a method return type where there is a clear need to represent”no result,” and where using null is likely to cause errors. A variable whose type is Optional should never itself be null; it should always point to an Optional instance.”
- Jinými slovy pokud z metody může vypadnout
null
a pokud to nejspíš bude problém, tak můžeme místo typu T vracet typ Optional<T> a tím si “vyžádat” kontrolu vrácené hodnoty ze strany volajícího. - Zajímavá je i poslední věta - není dobrý nápad dát do Optional
proměnné null
, byť technicky to možné je. - Ukázka