PDF

Výnimky II

Dvadsiata prednáška

Formát
PDF
Veľkosť
4,8 MB
Pridané
Stiahnutí
894
Stiahnuť PDF · 4,8 MB

Preber 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.

Otvoriť AI: ChatGPT · Claude · Gemini

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.