6108 Programmering i Java Leksjon 7 Filer og unntak Del2: 7.2 og 7.4 Roy M. Istad 2015 Fil: Permanent lagring av data PrintWriter(filnavn) throws Exception usjekkede/sjekkede unntak? skriver.println(data-i-tekstlinje) skriver.close(); Scanner leser = new Scanner(filnavn); File fil = new File(filnavn); Scanner leser = new Scanner(fil); leser.close(); Kvasikode: Åpne fila for lesing Les inn (første) linje fra fila Gjenta til slutten på fila Behandle innlest linje Les inn (neste) linje fra fila Lukk fila 6108 Programmering i Java Leksjon 7 Del 2 side 2 1
Eks. Heltall på fil: tallfil.txt 23 40 17 82 17 20 47 12 7 88 0 12 56 Splitter tekstlinje (String) parseint(string) Lese typede data Heltall adskilt av mellomrom og linjeskift (ulikt antall tall på linjene) Lesing fra fil: int sum = 0; while ( leser.hasnextint() ) sum += leser.nextint(); leser.close(); out.println("sum: " + sum); OBS! hasnextdouble og nextdouble leser desimaltall sum = 0 + 23 6108 Programmering i Java Leksjon 7 Del 2 side 3 Strukturerte data int String double int linje 1;Spade;220.50;23 1 Spade 220.50 23 «Skilletegnseparert fil» med varedata split Første linje kan ha info om dataene (bare kaste den?) int String double int Øvrige linjer har skilletegn mellom verdier i ulike datatyper (men, samme oppbygging av hver linje) Les en hel linje, splitt den på skilletegnet, og flytt verdiene over i egnede variabler (tabell/objekt) 6108 Programmering i Java Leksjon 7 Del 2 side 4 2
Strukturerte data: Vare-klassen public class Vare { int nr; String navn; double pris; int antall; // Konstruktør som setter verdi til alle objektvariabler public Vare(int nr, String navn, double pris, int antall) { this.nr = nr; this.navn = navn; this.pris = pris; this.antall = antall; : // Flere konstruktører : // Objektmetoder // Oppretter et vare-register // med plass til MAX_ANT stk. Vare[] vareliste = new Vare[MAX_ANT]; 6108 Programmering i Java Leksjon 7 Del 2 side 5 Scanner leser = new Scanner( new File(filnavn) ); String linje; if ( leser.hasnextline() ) // Fjerner kolonneoverskriftene linje = leser.nextline(); // Brukes ikke til noe (kastes ) int i = 0; // teller antall varer while ( leser.hasnextline() )&& { i<max_ant ) { linje = leser.nextline(); String[] datatab = linje.split(";"); int nr = parseint(datatab[0]); String navn = datatab[1]; double pris = parsedouble(datatab[2]); int antall = parseint(datatab[3]); vareliste[i++] = new Vare(nr,navn,pris,antall); // NB! Postinkrementering leser.close(); int antallvarer = i; // Ikke sikkert at tabellen er full... Strukturerte data: Vare-klassen linje.split("#"); linje.split(" - "); regex: s. 225 6108 Programmering i Java Leksjon 7 Del 2 side 6 3
Unntakshåndtering Vi har fram til nå kjørt program i en problemfri setting. Vi kan ikke forutsette at det er slik i realistiske program. Noen vanlige feil som kan oppstå ved bruk av filer: Filnavnet kan være feil. Filen er ikke dervi tror den er. Filen kan være skadet. Filinnholdet er ikke organisert som det er forutsatt i programkoden (typekonflikt). 6108 Programmering i Java Leksjon 7 Del 2 side 7 Unntak - Exception Unntak: Feil eller avvik fra normalt programforløp - Exception. Kjente unntak: Dele et heltall på null, eller hente ut en verdi fra en tabell via en ulovlig indeks. Vi har så langt akseptert at programmet har krasjet i slike tilfeller. Noen unntak kan ikke bare ignoreres i et program! Vi får ikke programmert filbehandling uten å ta stilling til hva som skal skje om et problem oppstår. Vi må enten fange og håndtere unntaket, eller eksplisitt videresende unntaket. Hittil har vi valgt det siste ved å merke metoder med throws Exception. Og, når et unntak blir videresendt fra main blir resultatet igjen at programmet krasjer 6108 Programmering i Java Leksjon 7 Del 2 side 8 4
Problem oppstår: Et unntak kastes Et problem har oppstått og unntaket e er kastet. Tenk på unntaket som en ball som blir kastet. Hvis vi ikke tar imot ballen, eller om vi får den og bare kaster den videre (throws), så vil den havne i vinduet som da knuses (dvs. programmet krasjer). 6108 Programmering i Java Leksjon 7 Del 2 side 9 Fange unntak try { Setninger som innebærer en viss risiko forsøkes utført her. Går noe galt blir det kastet et unntak... catch (Unntaksklasse e) {... et unntak e blir fanget her. Dvs. vi har noen setninger som håndterer situasjonen som er oppstått. Navnet e på unntaket er tatt fra e i exception. Et unntak blir representert ved et objekt. Metoden som oppdager feilsituasjonen og kaster unntaket, vil opprette et objekt fra en av unntaksklassene. Dette objektet inneholder detaljert informasjon om selve problemet. 6108 Programmering i Java Leksjon 7 Del 2 side 10 5
Noen unntaksklasser (side 300) tabellverdi[-1] 5/0 parseint(3a4) parsedouble(2,0); 6108 Programmering i Java Leksjon 7 Del 2 side 11 try { skriver = new PrintWriter("kat/ut.txt"); int tall = parseint( showinputdialog("gi tall:") ); skriver.println(tall); catch (FileNotFoundException e) { melding = "Katalogen finnes ikke!"; catch (NumberFormatException e) { melding = "Feil tallformat!"; catch (Exception e) { melding = "Feil med dataene!"; finally { if ( skriver!= null ) { skriver.close(); try-catch-finally NB! Exception-klassen fanger alle unntak, brukes alene eller helt sist (som her, med litt «finsiling» av feilene først). Finally-greina blir alltid utført, uansett hva som har skjedd foran 6108 Programmering i Java Leksjon 7 Del 2 side 12 6
Robust innlesing av heltall (via metode) private public static int lespositivtheltall () { int tall = 0; boolean ok = true; // Det går sikkert bra String feil = "", melding = "Gi positivt heltall:"; do { String talltxt = showinputdialog (feil+melding); try { tall = parseint( talltxt ); ok = tall > 0; catch ( NumberFormatException e ) { ok = false; feil = "Ulovlig verdi!" + "\n"; while (!ok ); return tall; try-catch er nyttig til mye mer enn fil-behandling! 6108 Programmering i Java Leksjon 7 Del 2 side 13 6108 Programmering i Java Slutt på leksjon 7 Del 2 7