unntak nesten uten arv
TRANSCRIPT
-
8/14/2019 Unntak Nesten Uten Arv
1/32
1
Lringsml for forelesningen
Objektorientering Hndtering av unntak (eng: exceptions)
Java-programmering Hndtering av unntak
(kapittel 17 i Liang)
Exception-objekter og klasser
try, catch og finally throw og throws
Eclipse Se p klassehierarki med F4
-
8/14/2019 Unntak Nesten Uten Arv
2/32
2
Unntak (eng: exceptions)
I et program er det mye som kan g galt koden kan inneholde feil som viser seg ved kjring, f.eks. at
attributter fr gale verdier eller det er inkonsistens mellom to ender
av en relasjon
unskede, men forventede ting skjer, som det vil kludre til koden
hndtere overalt i koden, f.eks. at en filoverfring brytes og m
gjenopptas senere
omgivelsene kan endre seg underveis, slik at uventede situasjoneroppstr, f.eks. en fil som slettes mens programmet leser fra eller
skriver til den
Hva gjr en programmerer med slikt?
-
8/14/2019 Unntak Nesten Uten Arv
3/32
3
Unntak (eng: exceptions)
Det finnes to prinsippielt ulike strategier for hndtere slikt:
2. En kan (fortvilt) prve
unng
feil, f.eks. ved bedre metoder for avdekke behov og krav grundig gjennomgang av kode fr den settes i produksjon
bedre og grundigere testing, slik at flere feil lukes bort
3. En kan oppdage og reagere p dem p en ryddig
mte validering av input fra omgivelsene (filer, nettet, brukere, ...) og
parameterverdier til metoder, slik at feil ikke fr forplante seg videre.
-
8/14/2019 Unntak Nesten Uten Arv
4/32
4
Unntak (eng: exceptions)
1. En kan (fortvilt) prve unng feil, f.eks. ved
2. En kan oppdage og reagere p dem p en ryddig mte
Det vil alltid gjenst feil en ikke har oppdaget ogsituasjoner en ikke har forutsett, som gjr at en m regnemed unntak.
Det har vist seg vre ryddigere skrive kode fornormal-tilfellet (hva n det mtte vre) og hndtere
unntakene vha. en egen unntaksmekanisme. Java har en mekanisme for si fra om og hndtere slike
unntak, som gjr at kode for normalsituasjonen ikke blirfor tilkludret.
-
8/14/2019 Unntak Nesten Uten Arv
5/32
5
Unntaksmekanismen
Java sin unntaksmekanisme er todelt
throw brukes for si fra om at et unntak har oppsttt(eng: throw an exception)
try { ... }catch (...){ ... }brukes
for angi at en er beredt til hndtere en bestemt typeunntak (eng: catch an exception)
-
8/14/2019 Unntak Nesten Uten Arv
6/32
6
Exception-objekter
Instanser av (subklasser av) Exception,brukes for lagre data om unntaket
Exception-objektet br inneholder relevant informasjon om hva
som gikk galt. catch-setningen angir hvilke typer Exception-instanser den kan ta
imot, dvs. instanser av hvilke subklasser den hndterer. Data fraException-instansen som er kastet kan brukes for finne ut hvasom skal gjres.
N
r unntaket angis vha. throw, nsteskallene tilbake (som ved return, men utenreturverdier) til nrmeste catch sompasser til unntaket
-
8/14/2019 Unntak Nesten Uten Arv
7/32
7
Eksempel p bruk av try/catch (1)
I vrens aller frste forelesningstime lagde vi etprogram tok en radius som input vha.programargumenter og beregnet omkrets og areal:
Hva skjer nr vi ikke skriver inn noenprogramargumenter?
-
8/14/2019 Unntak Nesten Uten Arv
8/32
8
Eksempel p bruk av try/catch (2)
Vi sier fra at vi kan hndtere dette unntaket vha try/catch:
try { ... } brukes for avgrense hvilken kode vinsker beskytte mot unntak. catch(...){ ... } brukes for angi hva slags
unntak vi kan hndtere og hva vi nsker gjre dersomunntaket oppstr og fanges opp.
-
8/14/2019 Unntak Nesten Uten Arv
9/32
9
Eksempel p bruk av try/catch (3)
Vi angir tre-komma-fjorten som programargument:
En ny type feil kan fanges opp med en ny catch-blokk:
Vi kan fange opp flere typer feil med flere catch-blokker, eller mankan fange opp flere typer vha. en mer generell catch-blokk:
-
8/14/2019 Unntak Nesten Uten Arv
10/32
10
Eksempel p bruk av try/catch (4)
try { ... } catch ( ... ) { ... } fanger opp alle angitte typer unntak somoppstr mens try-delen utfres, selv om det skjer i et nstet kallog/eller i en annen klasse/objekt:
Her oppstr
unntaket
Her fanges unntaket opp
-
8/14/2019 Unntak Nesten Uten Arv
11/32
11
Lynkurs i arv
Klasser struktureresi et hierarki, f.eks.C1, C11, C12, C2,C21, C22
Et objekt laget somen instans av en
klasse C, erinstanceof Cog alle C sinesuperklasser
C2 C1
Object
C21 C11C22 C12
peker p
superklassen
C21 c21 = new C21();
c21 instanceof C2 = = true
-
8/14/2019 Unntak Nesten Uten Arv
12/32
12
Exception-hierarkiException
IOEx.RuntimeEx.
IllegalArgumentEx.
NumberFormatEx.
NullPointerEx.
ArrayI.O.O.B.Ex.StringI.O.O.B.Ex.
IndexOutOfBoundsEx.
FileNotFoundEx.
-
8/14/2019 Unntak Nesten Uten Arv
13/32
-
8/14/2019 Unntak Nesten Uten Arv
14/32
14
throw
Du br selv bruke throw nr du oppdager atnoe er galt, som ikke kan hndteres p engod mte der problemet oppdages, f.eks.
bruke throw newIllegalArgumentException(...),dersom du oppdager at et parameter har enugyldig verdi
Vi skal etterhvert se hvordan en kandefinere egne typer unntaksklasser(Exception-subklasser)
-
8/14/2019 Unntak Nesten Uten Arv
15/32
15
try { ... } catch { ... }
oppsummert throw sier fra at et unntak har oppsttt
try/catch sier fra at vi i lpet av utfrelsen av en
kodesnutt kan h
ndtere en eller flere typer unntak,dersom de mtte oppst
Dersom ingen unntak oppstr, vil catch-delen ikkebli utfrt
Dersom et unntak oppstr og vi har en tilsvarendecatch-del, vil denne bli utfrt
Koden etter try/catch-blokken vil s fortsette
-
8/14/2019 Unntak Nesten Uten Arv
16/32
16
Boksmodellen
metode1 har entry/catch-blokk
metode3 bruker throwfor angi et unntak
aktivering av metode3og metode2 brytes og
metode1 fortsetter icatch-delen sompasser tilunntakstypen
metode1(int) : minKlasse
catch Exception
metode3(int) : minKlasse
...
metode2(int) : minKlasse...
metode1(int) : minKlasse
...
-
8/14/2019 Unntak Nesten Uten Arv
17/32
-
8/14/2019 Unntak Nesten Uten Arv
18/32
-
8/14/2019 Unntak Nesten Uten Arv
19/32
19
Egendefinerte unntakstyper
Egne unntakstyper kan defineres ved lage en subklasse av Exceptioneller en av dennes subklasser
Eksempel, unntak for ulovlig radiuser
En unntaksklasse er en helt vanlig klasse, og m flgelig definerekonstruktrer og bruke super(...) for kalle superklassens konstruktr
Egne unntaksklasser br inneholde detaljer om hva som var feil ogevt. en redefinering av getMessage()
-
8/14/2019 Unntak Nesten Uten Arv
20/32
20
RuntimeException vs. Exception
RuntimeException (skalt unchecked) er en subklasse av
Exception for unntak som er uventede (i en eller annen
forstand)
Feil i koden eller feil bruk av koden
Andre typer, (skalt checked) dvs. subklasser av Exception
som ikke samtidig er subklasser av RuntimeException
brukes for feil som er forventet (i en eller annen forstand)
Forventede komplikasjoner, skapt av omgivelsene
-
8/14/2019 Unntak Nesten Uten Arv
21/32
-
8/14/2019 Unntak Nesten Uten Arv
22/32
22
throws
To spesifikke krav stilles dersom en metode
kan komme til bli avbrutt av et checked
unntak (som ikke er en RuntimeEx.): den m eksplisitt deklarere unntakstypen(e) vha. throws
etter parameterlista
metoder som kaller en metode med en slik deklarasjon, m enten
fange opp unntaket vha. try/catch for denne unntakstypen eller
selv deklarere unntakstypen vha, throws
IOException kan f.eks. ikke ignoreres
-
8/14/2019 Unntak Nesten Uten Arv
23/32
23
throws
Ved riktig valg av superklasse for
egendefinerte unntaksklasser, kan en
alts tvinge kallende metoder til
enten hndtere unntaket eller si fra at
unntaket kan oppst
-
8/14/2019 Unntak Nesten Uten Arv
24/32
24
La oss ta en titt p
unntakshierarkiet Viktige RuntimeException-klasser
NullPointerException gjre noe med null
ClassCastException prver caste verdi til ulovlig klasse
IndexOutOfBoundsException negativ eller for stor index tiltabell- eller String-operasjoner
NoSuchElementException for mange next() p en Iterator
UnsupportedOperationException angis at valgfri metode igrensesnitt ikke er implementert, f.eks. remove i Iterator
IllegalArgumentException feil ved validering av argument NumberFormatException feil i tallformat
Viktige Exception-klasser IOException
-
8/14/2019 Unntak Nesten Uten Arv
25/32
25
java.io.IOException
IOException er en Exception som mfanges opp eller deklareres at kan
oppst, dvs. enten try { ... } catch (IOException ioe) { ... }, eller
throws IOException
IO-feil er s
pass vanlige og alvorlige,og m derfor hndteres.
Eksempel p lesing fra fil flger...
-
8/14/2019 Unntak Nesten Uten Arv
26/32
-
8/14/2019 Unntak Nesten Uten Arv
27/32
27
M sikre oss at
reader.close() blir kalt
Hva skjer hvis vi
underveis fr en
annen type Exception?
-
8/14/2019 Unntak Nesten Uten Arv
28/32
-
8/14/2019 Unntak Nesten Uten Arv
29/32
29
finally sikrer at reader.close()
alltid blir kalt
Hva skjer hvis vi fr en feil
frreader settes?
-
8/14/2019 Unntak Nesten Uten Arv
30/32
30
Ikke bruk try/catch i utide
try {Iterator it = liste.iterator();
while (true) {
Object o = it.next();// gjr noe med o her
}} catch (Exception e) {
} Her brukes try/catch som vanlig kontrollstruktur,
hvor it.hasNext() skulle vrt brukt. Fy, fy!
-
8/14/2019 Unntak Nesten Uten Arv
31/32
31
Lringsml for forelesningen
Objektorientering Hndtering av unntak (eng: exceptions)
Java-programmering Hndtering av unntak
Exception-objekter og klasser
try, catch og finally
throw og throws
Eclipse Se p klassehierarki med F4
-
8/14/2019 Unntak Nesten Uten Arv
32/32
32
Har du ndd lringsmlene?
Java-programmering Lag en NorskeTall-klasse som parser norske tall skrevet
med ord, f.eks. en, tjueen, frtiseks osv. for tall opp til
100.
Lag en egen type unntak som subklasser
NumberFormatException, som NorskeTall-klassen bruker til
si fra om feilformatterte tall. Det skal angis om feilen var
for hele tallet (dvs. uforstelig), tierdelen (f.eks. xxxen
eller enerdelen (f.eks. tjueti).
Hva skjer nr du endrer koden slik at du subklasser
Exception istedenfor NumberFormatException, og hva m
du gjre?