Å lage sikre klasser Unntaksklassene i Java-API-et Unntakshåndtering i databasesammenheng try-catch-finally-setningen Trelagsarkitektur; egen databaseklasse Transaksjonshåndtering LC191D Videregående programmering Semesterplan: http://aitel.hist.no/fag/vprg/index_lc191d.php Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring Else Lervik, februar 2011 Å lage sikre klasser (kap. 6.5, side 196-198) Klasser skal lages slik at de i minst mulig grad er avhengig av at klienten gjør bestemte ting STOL ALDRI PÅ KLIENTEN! Argumenter bør kontrolleres Øving 3, klassen Rom public boolean legginnnyreservasjon(tidspunkt fratid, Tidspunkt tiltid, String navn, String tlf, int antpers) { Kontroller argumentene, dog begrensede krav til testing i dette kurset Klienten kan, men behøver ikke, være et objekt av klassen konferansesenter Tilbakemelding om feil gis fortrinnsvis via returverdien: Forelesning 6, side 2 1
Å lage sikre klasser (kap. 6.5, side 196-198) Klasser skal lages slik at de i minst mulig grad er avhengig av at klienten gjør bestemte ting STOL ALDRI PÅ KLIENTEN! Dere må ikke forutsette at klienten kaller metodene i en klasse i en bestemt rekkefølge. Dere må lage metodene slik at de i størst mulig grad står på egne bein. Argumenter bør kontrolleres Øving 3, klassen Rom public boolean legginnnyreservasjon(tidspunkt fratid, Tidspunkt tiltid, String navn, String tlf, int antpers) { Kontroller argumentene, dog begrensede krav til testing i dette kurset Klienten kan, men behøver ikke, være et objekt av klassen konferansesenter Tilbakemelding om feil gis fortrinnsvis via returverdien: true/false Heltall (navngitte konstanter) Referanse, eventuelt null Ikke strenger!!!! Seogså ENUM, side 511 Forelesning 6, side 3 Å lage sikre klasser, forts. Når kan vi ikke bruke returverdien? Melding fra konstruktøren Set-metoder av standard type, de har returtype void Der returverdien ikke kan benyttes fordi alle mulige returverdier er gyldige data Hva gjør vi da? Da må vi kaste unntaksobjekter Forelesning 6, side 4 2
Eksempel på håndtering av unntak Lag kode som leser inn heltall fra brukeren via showinputdialog() Gi tilbakemelding dersom ugyldig tall Vis klassen mittbibliotek.dataleser, side 495-497 Forelesning 6, side 5 Unntaksklassene i Java-API-et figur side 498 Denne typen unntak skal sjelden håndteres. Forelesning 6, side 6 3
RuntimeException, eksempler Mange av disse unntakene kan unngås med enkle if-tester ArrayIndexOutOfBoundsException if (indeks >= 0 && indeks < arraylist.size()) if (indeks >= 0 && indeks < tabell.length) NullPointerException if (referanse!= null). AritmeticException if (nevner!= 0) Forelesning 6, side 7 RuntimeException, eksempler Mange av disse unntakene unngås med enkle if-tester ArrayIndexOutOfBoundsException if (indeks >= 0 && indeks < arraylist.size()) if (indeks >= 0 && indeks < tabell.length) NullPointerException if (referanse!= null). ArithmeticException if (nevner!= 0). Unntakshåndtering skal ikke brukes som alternativ til en if-setning Forelesning 6, side 8 4
Behov for unntakshåndtering i databasesammenheng? Forelesning 6, side 9 try-catch-finally-setningen, eksempel Programmering av unntakshåndtering i databasesammenheng try { kode } catch (parameter) {. kode } catch (parameter) { kode } catch { } finally { kode som utføres alltid, uavhengig av hva som skjer foran også dersom det står en return-setning i koden Det eneste som kan forhindre at finally-blokken blir utført,. er System.exit() } Skisser kode med fullstendig unntakshåndtering: DatabaseKontaktMedExc.java Vis tilsv. kode der unntakshåndteringen er flyttet ut i en klasse DatabaseKontaktMedExc2.java Opprydder.java, programliste 24.3, side 831-832 Forelesning 6, side 10 5
Trelagsarkitektur figur side 844 Forelesning 6, side 11 Egen klasse for databasehåndteringen figur side 825, kode side 827-831, fil Database.java Forelesning 6, side 12 6
Transaksjonshåndtering Tabellen konto create table konto( kontonr varchar(15) not null, navn varchar(30) not null, saldo decimal not null, primary key (kontonr)); insert into konto values ('12345', 'Ole Pettersen', 5250); insert into konto values ('34567', 'Ole Pettersen', 3456); insert into konto values ('45632', 'Ingrid Bø', 1000); Vis kode, Transaksjonstest.java, side 850-851 Øving 6 Egen klasse for databaseoperasjoner mot databasen fra øving 5 Transaksjonshåndtering nødvendig i noen av metodene Forelesning 6, side 13 7