Výnimky II
Dvadsiata prednáška
Stiahnuť PDF · 4,8 MBPreber si túto poznámku so svojou AI
Skopíruj pripravený podklad a vlož ho do ChatGPT, Claude alebo inej AI — bude ťa učiť alebo skúšať len z tejto poznámky.
Náhľad poznámky
Výnimky – dokončenie
Informatika 2
Ludum Dare
• vytvorte hru za 48 hodín
• http://www.ludumdare.com/compo/
• 23. konanie súťaže
– 20.-23. Apríla
Pojmy zavedené v 8. prednáške(1)
• dedičnosť vs. interface
– nahradenie dedičnosti návrhovým vzorom Dekorátor
– imitácia interface dedičnosťou
Informatika 2
2
Pojmy zavedené v 8. prednáške(2)
• behové chyby
• komunikácia klient-server
• trojvrstvový model aplikácie
Informatika 2
3
Pojmy zavedené v 8. prednáške(3)
• defenzívna programovanie
• server - informovanie o chybách
• používateľa
• klienta
– návratová hodnota
– výnimka
Informatika 2
4
Pojmy zavedené v 8. prednáške(4)
• výnimky - hierarchia
• druhy
– Error
– Exception
– RuntimeException
• kontrolované výnimky
• nekontrolované výnimky
Informatika 2
5
Pojmy zavedené v 8. prednáške(5)
• vyhadzovanie výnimiek
• príkaz throw
• klauzula throws
Informatika 2
6
Pojmy zavedené v 8. prednáške(6)
• zachytávanie výnimiek
• prikaz try
• try-catch
• try-catch-finaly
• try-finally
Informatika 2
7
Cieľ prednášky
• výnimky
– posunutie, vlastné
– príkaz assert
– zotavenie sa po chybách
– predchádzanie chybám
• vstupy a výstupy
– štandardný vstup a výstup
– textové súbory
– objektové prúdy
Informatika 2
8
Zachytávanie výnimiek
• metóda nesmie ignorovať kontrolované výnimky
• príkaz try a v bloku catch zachytí príslušnú
výnimku
• klauzula throws v hlavičke metódy klienta
– klazula throws pre triedu výnimky, ktorú nezachytáva
žiadny blok catch
– posunutie výnimky vyššie
Informatika 2
9
Vlastné triedy výnimiek
• nová kontrolovaná výnimka – potomok triedy
Exception (alebo od nej odvodenej triedy)
• nová nekontrolovaná výnimka – potomok triedy
RuntimeException
• konvencia – názov konci slovom Exception
Informatika 2
10
Dôvody použitia vlastných výnimiek
• neexistuje štandardná výnimka, ktorá dostatočne
popisuje chybu
• vyčlenenie samostatnej výnimky
• existuje doplňujúca informácia, ktorá môže mať
vplyv na riešenie chyby – kontrolované výnimky
Informatika 2
11
Príklad triedy vlastnej výnimky
public class NeznameDieloException
extends Exception
{
public NeznameDieloException(String paNazov)
{
super("Dielo s nazvom " + paNazov +
" nebolo najdene.");
}
}
Informatika 2
12
Vlastná výnimka
• NeznameDieloException
• definícia triedy – odčlenenie výnimky od
štandardných
• kontrolovaná výnimka
• zostavenie textu chybového hlásenia v
konštruktore
• využitie konštruktora predka
• ostatné metódy získava od predka
Informatika 2
13
Využitie vlastnej výnimky – Katalog
public void vymaz(String paTitul)
throws NeznameDieloException
{
...
AVIDielo polozka = this.vyhladaj(paTitul);
if (polozka == null) {
throw new NeznameDieloException(paTitul);
} else {
aZoznamPoloziek.remove(polozka);
}
}
Informatika 2
14
Metóda vymaz triedy Katalog
• klauzula throws – vyhadzuje kontrolovanú
výnimku
• test výsledku vyhľadania
• vyhodenie výnimky
Informatika 2
15
Zachytenie vlastnej výnimky(1)
public class VykonavacVymaz implements IVykonavac
{
private ITerminal aTerminal;
...
public boolean vykonaj(Katalog paKatalog,
String paParameter)
{
...
}
}
Informatika 2
16
Zachytenie vlastnej výnimky(1)
try {
paKatalog.vymaz(paParameter);
} catch (NeznameDieloException ex) {
aTerminal.vypisRiadok(ex.getMessage());
ex.printStackTrace();
}
Informatika 2
17
Zachytenie vlastnej výnimky(3)
• príkaz try v metóde vykonaj vykonávača
• chránený príkaz vymazania z katalógu
• zachytenie výnimky = zotavenie sa z chyby
– informácia pre používateľa
• využitie zdedených metód
– getMessage() – text správy o chybe
– printStackTrace() – výpis textu na štandardný chybový
výstup – objekt System.err
Informatika 2
18
Kontrola stavu v konštruktore
• nesprávne parametre
• dve možnosti reakcie:
– zmena počiatočného stavu na správny
– vyhodenie výnimky
Informatika 2
19
Zmena počiatočného stavu na správny
• riešenie používané doteraz
• napr. AutomatMHD
– nekladná hodnota ceny lístka => použitie
prednastavenej hodnoty
• klient nevie o probléme
– možnosť informovať používateľa cez terminál
– možnosť informovať klienta cez špeciálnu správu
dajChybu()
Informatika 2
20
Vyhodenie výnimky v konštruktore
• oznámenie chyby klientovi
• inštancia sa vôbec nevytvorí
Informatika 2
21
Príklad – server
public CD(String paTitul, String paAutor, int paPocetSkladieb,
int paCelkovyCas)
{
super(paTitul, paCelkovyCas);
if (paAutor == null || paAutor.isEmpty()) {
throw new IllegalArgumentException("paAutor musi byt
nastaveny");
}
aAutor = paAutor;
if (paPocetSkladieb <= 0 ) {
throw new IllegalArgumentException("paPocetSkladieb musi
byt vacsi ako nula");
}
aPocetSkladieb = paPocetSkladieb;
}
Informatika 2
22
Príklad – klient
try {
CD cd = new CD(titul, autor, pocetSkladieb, cas);
paDatabaza.pridaj(cd);
} catch (IllegalArgumentException ex) {
System.out.println("Nespravne parametre!");
}
Informatika 2
23
Príklad – klient – nesprávne
CD cd;
try {
cd = new CD(titul, autor, pocetSkladieb, cas);
} catch (IllegalArgumentException ex) {
System.out.println("Nespravne parametre!");
}
paDatabaza.pridaj(cd);
Informatika 2
24
Chyba pri preklade
Informatika 2
25
Príklad – klient – tiež nesprávne
CD cd = null;
try {
cd = new CD(titul, autor, pocetSkladieb, cas);
} catch (IllegalArgumentException ex) {
System.out.println("Nespravne parametre!");
}
paDatabaza.pridaj(cd);
Informatika 2
26
Chyba za behu
Informatika 2
27
Možnosti práce s výnimkami v klientovi
• zotavenie sa z chyby
• predchádzanie chybám
Informatika 2
28
Zotavenie sa z chyby
• príkazy v bloku catch
• niekedy nový pokus s celým príkazom try
– napr. vstupy
• nemusí sa podariť
• pozor na nekonečný cyklus
Informatika 2
29
Príklad – zápis do súboru(1)
…
boolean uspech = false;
int pocetPokusov = 0;
while (uspech == false) {
// pokus o zapis do suboru – prikaz try
}
…
Informatika 2
30
Príklad – zápis do súboru(2)
try {
// zapis do suboru
uspech = true; // posledny prikaz bloku
} catch (IOException e) {
if (pocetPokusov < MAX_POCET) {
pocetPokusov++;
// vyber inu moznost, kam zapisat subor
} else {
throw e; // vynimka sa posuva vyssie
}
}
Informatika 2
31
Predchádzanie chybám(1)
• vyžaduje spoluprácu klienta so serverom
• príklad – duplicita v katalógu CD a DVD
– vyhladaj – vráti null, ak titul v katalógu nie je
– ak sa kontroluje, netreba vyhadzovať výnimku
• server musí poskytnúť možnosť
• klient nemusí riešiť príslušnú výnimku
Informatika 2
32
Predchádzanie chybám(2)
• nevýhody
– zvyšuje sa implementačná závislosť
– server sa poisťuje – dvojité testovanie
Informatika 2
33
Výnimky a testovanie
• JUnit využíva výnimky na oznamovanie chýb
• assertEquals, assertNull, ...
– AssertionError (potomok Error)
• test končí chybou po ľubovoľnej výnimke
Informatika 2
34
Negatívne testy
• neprípustné parametre spôsobia výnimku?
• ! výnimka ukončí test chybou
– nie je to, čo chceme
• dve možnosti riešenia
– try-fail-catch
– expected (JUnit 4.x)
Informatika 2
35
try-fail-catch
@Test
public void newCDZlyTitul()
{
try {
new CD(null, "Niekto", 5, 30);
fail("Neošetrená hodnota null ako titul");
} catch (IllegalArgumentException ex) {
// vynimka nastala = ok
}
}
Informatika 2
36
expected (JUnit 4.x)
@Test(expected = IllegalArgumentException.class)
public void newCDZlyAutor()
{
new CD("Nieco", null, 5, 30);
}
Informatika 2
37
Vstupy a výstupy
Informatika 2
38
Vstupy a výstupy programov
• programy – algoritmy
– hromadnosť => nie na jediné použitie
– jeden druh úlohy
– rôzne začiatočné hodnoty
– rôzne výsledky
40
Informatika 2
Vstupy a výstupy programov
program
vstupy
výstupy
41
Informatika 2
Štandardný vstup a výstup
program
vstupy
výstupy
Štandardný vstup a výstup
• Trieda System
• atribúty objektového typu:
– in – vstup
– out, err – výstup
Informatika 2
42
Štandardný výstup
• výpis textu na obrazovku
• priame použitie v programe
• out – statický typ PrintStream
– najčastejšie správy
• print(String paText)
• println() – nový riadok
• println(String paText)
Informatika 2
43
Štandardný vstup
• čítanie textu (postupnosti znakov) z klávesnice
• čaká na ukončenie písania na klávesnici – enter
• kontrolný opis na obrazovku – JVM (+OS)
• in – statický typ InputStream
– System.in sa väčšinou nevyužíva v programe priamo
– využitie v programe pomocou triedy Scanner
– Scanner – obaľuje System.in
Informatika 2
44
Scanner next a hasNext
• oddeľovače - skupina znakov (Whitespace):
medzera, tabulátor, novy riadok
• rozdelenie vstupného riadku pomocou
oddeľovačov na slová (tokeny)
• boolean hasNext()
– existuje ešte slovo?
• String next()
– prečíta nasledujúce slovo, všetky oddelovače pred
slovom vynechá
Informatika 2
45
Scanner
• ďalšie správy inštancii triedy Scanner
• boolean hasNextPrimitivnyTyp()
– nasledujúce slovo
• PrimitivnyTyp nextPrimitivnyTyp()
– InputMismatchException
• boolean hasNextLine() -
• String nextLine()
Informatika 2
46
Scanner – vytvorenie
• čítanie štandardného vstupu:
• čítanie ľubovoľného reťazca
Informatika 2
47
Scanner klavesnica = new Scanner(System.in);
String riadok = ...;
Scanner parser = new Scanner(riadok);
Projekt KCaIB
• katalóg CD a DVD
• objekty treba vždy nanovo vytvárať
• (alebo nechať navždy zapnutý program)
• úloha: ukladanie katalógu do súborov
Informatika 2
48
49
Informatika 2
Súbory
program
vstupy
výstupy
Trieda File
• poskytuje základné informácie o súbore
– názov súboru
– čas zmeny
– práva na súbor
– existencia súboru na disku
– absolútna cesta
– ...
• o spolupráci jazyka Java s OS
• nepracuje s obsahom súboru
Informatika 2
50
Možnosti realizácie
• textové súbory
• binárne súbory
• serializácia objektov
Informatika 2
51
Práca so súbormi
• čítanie
– otvorenie súboru na čítanie
– postupné čítanie obsahu
– zatvorenie súboru
• zápis
– otvorenie súboru na zápis
– postupný zápis nového obsahu
– zatvorenie súboru
Informatika 2
52
Textové súbory
• čitateľné človekom
• najťažšie na strojové spracovanie
• Príklady
– textové súbory .txt
– zdrojové kódy .java
– ...
Informatika 2
53
Textové súbory v jazyku Java
• čítanie
– trieda Scanner
– Scanner(File paSubor)
• zápis
– trieda PrintWriter
– PrintWriter(File paSubor)
– rozhranie podobné ako System.out
• nutnosť uzavretia súboru správou close()
Informatika 2
54
Metóda zapis v triede Katalog
public void zapis() throws IOException
{
File subor = new File("Katalog.txt");
PrintWriter zapisovac = new PrintWriter(subor);
for (AudiovizualneDielo dielo : aZoznam) {
dielo.zapis(zapisovac);
}
zapisovac.close();
}
Informatika 2
55
Metóda zapis v triede AudiovizualneDielo
public abstract void zapis(PrintWriter paZapisovac);
Informatika 2
56
Metóda zapis v triede CD
public void zapis(PrintWriter paZapisovac) {
paZapisovac.println("CD");
paZapisovac.println(this.dajTitul());
paZapisovac.println(this.dajCelkovyCas());
paZapisovac.println(aAutor);
…
}
Informatika 2
57
Metóda zapis v triede DVD
public void zapis(PrintWriter paZapisovac)
{
paZapisovac.println("DVD");
paZapisovac.println(this.dajTitul());
paZapisovac.println(this.dajCelkovyCas());
paZapisovac.println(aReziser);
…
}
Informatika 2
58
Výsledok v súbore
CD
The Best of
30
The Beatles
12
DVD
Tenkrat na zapade
90
Neznamy autor
Informatika 2
59
Metóda nacitaj v triede Katalog
public void nacitaj() throws IOException
{
aZoznam.clear();
File subor = new File("Katalog.txt");
Scanner citac = new Scanner(subor);
while (citac.hasNextLine()) {
…
}
citac.close();
}
Informatika 2
60
Metóda nacitaj v triede Katalog
String typ = citac.nextLine();
if (typ.equals("CD")) {
aZoznam.add(new CD(citac));
} else {
aZoznam.add(new DVD(citac));
}
Informatika 2
61
Nový konštruktor v triede CD
public CD(Scanner paCitac)
{
super(paCitac.nextLine(), paCitac.nextInt());
aAutor = paCitac.nextLine();
…
}
Informatika 2
62
Nový konštruktor v triede DVD
public DVD(Scanner paCitac)
{
super(paCitac.nextLine(), paCitac.nextInt());
aReziser = paCitac.nextLine();
…
}
Informatika 2
63
Problémy s textovými súbormi(1)
• príklad nebude fungovať
• problém s koncom riadku za číslom (30, 12)
• nextLine po nextInt prečíta prázdny reťazec
• možné riešenia
– zapisovať čísla bez konca riadku – viac problémov ako
úžitku
– prečítať najskôr riadok a ten postupne čítať pomocou
triedy Scanner
– po čísle prečítať zvyšok riadku a zabudnúť
Informatika 2
64
Problémy s textovými súbormi(2)
• ďalší problém – viacriadkové komentáre
• riešenie = DÚ
• problémy s formátovaním
– zápis – bez problémov ľubovoľný formát
– čítanie – komplikované
Informatika 2
65
Binárne súbory
• nečitateľné človekom, resp. čitateľné
komplikovane
• formát rovnaký ako v pamäti – jednoducho
spracovateľný počítačom
• pri dodržaní poradia zápisu a čítania dát (musia
byť zhodné) nehrozí problém s formátovaním
Informatika 2
66
Binárne súbory v jazyku Java
• čítanie
– trieda FileInputStream
– FileInputStream(File paSubor)
• zápis
– trieda FileOutputStream
– FileOutputStream(File paSubor)
• komplikované – možnosť zapisovať iba byte[]
• nutnosť uzavretia súboru správou close()
Informatika 2
67
Binárne súbory v jazyku Java
• zjednodušenie – práca s primitívnymi typmi
jazyka Java
• čítanie
– trieda DataInputStream
– DataInputStream(FileInputStream paStream)
• zápis
– trieda DataOutputStream
– DataOutputStream(FileOutputStream paStream)
• nutnosť uzavretia súboru správou close()
Informatika 2
68
Trieda DataOutputStream
• writePrimitivnyTyp(PrimitivnyTyp paHodnota)
– zapíše hodnotu primitívneho typu do súboru
• writeUTF(String paRetazec)
– zapíše reťazec do súboru
Informatika 2
69
Trieda DataInputStream
• PrimitivnyTyp readPrimitivnyTyp()
– prečíta hodnotu primitívneho typu zo súboru
• String readUTF()
– prečíta reťazec zo súboru
Informatika 2
70
Metóda zapis v triede Katalog
public void zapis() throws IOException
{
File subor = new File("Katalog.txt");
FileOutputStream stream
= new FileOutputStream(subor);
DataOutputStream zapisovac
= new DataOutputStream(stream);
for (AudiovizualneDielo dielo : aZoznam) {
dielo.zapis(zapisovac);
}
}
Informatika 2
71
Metóda zapis v triede AudiovizualneDielo
public abstract void zapis
(DataOutputStream paZapisovac)
throws IOException;
Informatika 2
72
Metóda zapis v triede CD
public void zapis(DataOutputStream paZapisovac)
throws IOException
{
paZapisovac.writeUTF("CD");
paZapisovac.writeUTF(this.dajTitul());
paZapisovac.writeInt(this.dajCelkovyCas());
paZapisovac.writeUTF(aAutor);
…
}
Informatika 2
73
Metóda zapis v triede DVD
public void zapis(DataOutputStream paZapisovac)
throws IOException
{
paZapisovac.writeUTF("DVD");
paZapisovac.writeUTF(this.dajTitul());
paZapisovac.writeInt(this.dajCelkovyCas());
paZapisovac.writeUTF(aReziser);
…
}
Informatika 2
74
Výsledok v súbore
Informatika 2
75
Metóda nacitaj v triede Katalog
public void nacitaj()
{
boolean koniecSuboru = false;
aZoznam.clear();
File subor = new File("Katalog.txt");
FileInputStream stream = new FileInputStream(subor);
DataInputStream citac = new DataInputStream(subor);
while (!koniecSuboru) {
…
}
}
Informatika 2
76
Metóda nacitaj v triede Katalog
try {
String typ = citac.readUTF();
if (typ.equals("CD")) {
aZoznam.add(new CD(citac));
} else {
aZoznam.add(new DVD(citac));
}
} catch (EOFException ex) {
koniecSuboru = true;
}
Informatika 2
77
Nový konštruktor v triede CD
public CD(DataInputStream paCitac)
{
super(paCitac.readUTF(), paCitac.readInt());
aAutor = paCitac.readUTF();
…
}
Informatika 2
78
Nový konštruktor v triede DVD
public DVD(DataInputStream paCitac)
{
super(paCitac.readUTF(), paCitac.readInt());
aReziser = paCitac.readUTF();
…
}
Informatika 2
79
Vďaka za pozornosť
Automaticky vygenerovaný textový náhľad. Pre plné formátovanie si stiahnite súbor.
nechodím na prednášky