Oversikt. Array indeks utenfor sine grenser. Feil i programmet hva skjer?

Like dokumenter
Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Oversikt. Feil i programmet hva skjer? Array indeks utenfor sine grenser. Inf1010 Våren Feilsituasjoner og unntak i Java

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Oversikt. Feil i programmet hva skjer? Array indeks utenfor sine grenser. Inf1010 Våren Feilsituasjoner og unntak i Java

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

INF1010 våren 2018 tirsdag 23. januar

INF1010 våren Arv og subklasser del 1 (pluss litt I/O og unntaksbehandling)

INF1010 våren Arv og subklasser del 1 pluss (hvis vi har tid) litt om Unntak, IO og Scanner-klassen

INF1010 våren Generalisering -spesialisering Gjenbruk av klasser. Ved arv. Klasse-hierarkier. Stein Gjessing.

Litt om pakker og mest om data inn og ut

INF1010, 8. mars Om klassehierarkier, grensesnitt (interface) og multippel arv. Konstruktører i subklasser. Unntak.

INF 1010, vår 2005 Løsningsforslag uke 11

Uke 5, 27. januar Arv og subklasser del I. Stein Gjessing Institutt for informatikk

INF1010 våren Arv og subklasser - del 2

Kapittel 11: Unntakshåndtering. Java som første programmeringsspråk

Leksjon 7. Filer og unntak

Kapittel 13: Unntakshåndtering

Kapittel 11: Unntakshåndtering. Java som første programmeringsspråk

Kapittel 13: Unntakshåndtering

INF1010 våren 2010 Torsdag 4. februar. Arv og subklasser del I. Emneoversikt subklasser (2 uker) Hva er en subklasse? Eksempel: Universitetsregister

INF Notat om I/O i Java

IN Notat om I/O i Java

INF1010 våren Arv og subklasser del I

Klasser skal lages slik at de i minst mulig grad er avhengig av at klienten gjør bestemte ting STOL ALDRI PÅ KLIENTEN!

TOD063 Datastrukturer og algoritmer

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

INF1000-SIKT - Notat om I/O i Java

Videregående programmering 6

Hittil har programmene kommunisert med omverden via tastatur og skjerm Ønskelig at data kan leve fra en kjøring til neste

Forelesning inf Java 4

2 Om statiske variable/konstanter og statiske metoder.

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Læringsmål for forelesningen

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

INF Uke 10. Ukesoppgaver oktober 2012

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Bruk av class Scanner, FileWriter og Formatter som alternativ til EasyIO i INF1000.

Forelesning inf Java 5

Forelesning inf Java 5

Jentetreff INF1000 Debugging i Java

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

2 Om statiske variable/konstanter og statiske metoder.

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

INF1000 (Uke 4) Mer om forgreninger, While-løkker

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Repetisjon. INF gruppe 13

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Repetisjon. Mer om forgrening While-løkker

Innlesning fra tastatur med easyio. INF1000 høst Vi må først skrive i toppen av programmet: import easyio.*;

IN-OO1-EVU Dag 3. Stein Gjessing. Kapittel 4: I/O, if og unntak (exceptions) Kapittel 5: While, switch, mer I/O Kapittel 6: Mengder av objekter

INF1000: noen avsluttende ord

UNIVERSITETET I OSLO

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Tre måter å lese fra terminal.

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

INF1000 : Forelesning 4

Oblig 4Hybelhus litt mer tips enn i oppgaven

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

INF2100. Oppgaver 26. september til 1. oktober 2007

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

UNIVERSITETET I OSLO

INF1000 : Forelesning 5

INF1000 : Forelesning 3

INF1000: Forelesning 6. Klasser og objekter del 1

UNIVERSITETET I OSLO

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

UNIVERSITETET I OSLO

Body Mass Index (BMI) INF1000 : Forelesning 3. Ferdig program (forts.) Ferdig program

Java 4. Mer om easyio Mer om forgreninger Løkker. 7. september 2004

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

Gjennomgang av eksamen H99

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

INF 1000 høsten 2011 Uke september

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

Å lese tall fra en fil, klassen Scanner

HØGSKOLEN I SØR-TRØNDELAG

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Fra Python til Java, del 2

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

Oversikt. INF1000 Uke 6. Objekter, pekere og null. Lese og skrive fra/til fil. Litt om objekter, pekere og null Filer og easyio. Litt mer om tekster

Ole Christian Lingjærde, 12. september 2013

Forelesning inf Java 4

Eksempel: Body Mass Index (BMI) Forelesning inf Java 3. Ferdig program (første del) Ferdig program (siste del)

Oversikt. INF1000 Uke 3. Repetisjon Program. Repetisjon Program. Litt repetisjon Program Variabler og Uttrykk Presedens Matematiske funksjoner

(MVC - Model, View, Control)

Transkript:

Inf1010 Våren 2007 Tirsdagene 6. mars (bare 1. time) og 10. april 2007 Feilsituasjoner og unntak i Java (og litt ekte Java I/O) Stein Gjessing, Institutt for informatikk, Universitetet i Oslo Oversikt n Hva er en feil (er det ikke mulig å unngå feil?) n Hva skjer når et program feiler n Mål 1: Å ikke få feilmeldinger fra kjøretidsystemet, men isteden la programmet få kontrollen tilbake etter en feilsituasjoen: n Der programmet normalt ville ha avsluttet med en feilmelding n Eks: Divisjon med null, greier ikke åpne en fil, filen finnes ikke, knytte kontakt over nettet mislykkes, utenfor arraygrensen n Mål 2: Enklere, mer vedlikeholdbar og mer forstålig kode 2 Feil i programmet hva skjer? import easyio.*; class Feil1 { public static void main(string[] args) { In tast = new In(); int i = 1, j = 1; Array indeks utenfor sine grenser int [ ] tallvektor; tallvektor = new int [100]; tallvektor[101] = 17; while ( i >= 0) { System.out.print("\n Divisjon: 100 delt på: (gi tall):"); i = tast. inint(); j = 100/ i; System.out.println("Svaret på 100/" + i + " er:" +j); 3 4

Unntak / feil, behandling i Java Dagens tema: Unntaksbehandling Kode som kan feile Feiler koden blir denne blokken kalt med feilobjektet e som parameter n Mye kode kan feile og feilaktige situasjoner (unntak) kan oppstå. n Kode som kan feile kan - og som oftest må - vi legge følgende rundt:... Kode som kan feile...; catch (Exception e) {... Gjør noe med feilen, prøv å rett opp... <USIKKER KODE> <Hvis det skjer noe galt:> throw new Unntaksklasse( ); catch (Unntaksklasse unt) { < Unntaksbehandling. Dette hoppes over når intet unormalt/galt har hendt > < her fortsetter vanligvis programmet både etter normal utføring og etter behandling av eventuelle unntak > Enkleste form for unntaksbehandling. På forhånd har vi deklarert: class Unntaksklasse extends Exception {... 5 6 Fire nye Java ord n throw - Starter å kaste et unntak throw <en peker til et unntaksobjekt> f.eks throw new Unntak(); n try - Står foran en blokk som er usikker dvs. der det kan oppstå et unntak n catch - Står foran en blokk som behandler et unntak. Har en peker til et unntaksobjekt som parameter n throws - Kaster et unntak videre Brukes i overskriften på en metode som ikke selv vil behandle et unntak n Bruk: n <usikker kode> catch (Unntaksklasse u) { <behandle unntaket, u peker på et objekt som beskriver unntaket> A A x = B ( ); catch (Unntaksklassen unt) { < Unntaksbehandling. Dette hoppes over når intet unormalt har hendt > < her fortsetter programmet både etter normal utføring og etter behandling av eventuelle unntak > Når unntak oppstår i en metode int B( ) throws Unntaksklassen { A kaller B B oppdager en feil: throw new Unntaksklassen ( ) ; Normal retur fra B til A: return 17; Unntaksklassen er en klasse som vi på forhånd har deklarert som en subklasse av klassen Exception. 7 8

Unntak - oversikt n Brukes til å fange feil - eller uvanlige situasjoner n Når en feilsituasjon oppstår: n Lages det et objekt n Dette objektet brukes av feilbehandlingen Feil og feil fru Blom som enten skjer I samme metode (try-catch) eller blir sendt tilbake til kallende metode (throws) n Vi må ikke (men kan) behandle feil av typen: n RunTimeException n Artimetriske feil n Array-grense-feil n Behandler vi ikke slike feil, avsluttes programmet av runtime-systemet n Error n Grusomme systemfeil vi ikke kan gjøre noe med Vi behøver ikke gjøre noe med feil/unntak (throws) n Vi kan bare sende dem videre til den metoden som kalte oss: throws (og helt til kjøresystemet: > java hvis det er main som kaster unntak/feilmeldinger videre). n Vi må da etter metodens parameter-parentes, men før begynnende krøll-parentes, skrive: n throws UnttakType1, UnntakType2,... { hvor UnttakType1, UnntakType2,... er de typer (klassenavnene) på de unntak som oppstår (eller superklasser av disse, f.eks. Exception) og ikke selv fanger med try-catch. n Merk at vi bruker ordet både for unntak metoden vår selv genererer og de unntak/feil metoden mottar (fra metoder den selv har kalt) og bare videresender. n Ulempe med videre-kasting av unntak: Jo nærmere feilkilden feilen blir rettet, jo bedre. 9 10 Sende feilene videre ut av main throws (ulempe programmet bare avslutter) To (tre) strategier for unntakshåndtering import easyio.*; class MinFeil extends Exception { MinFeil (String s) { super(s); class Feil { int i; public static void main(string[] args) throws ArrayIndexOutOfBoundsException, NumberFormatException, MinFeil { int j; j = new Feil().a(args[0]); System.out.println("RIKTIG: j = + j); n Fange unntaket med try-catch og gjøre noe i catch-delen n Ikke bruke try-catch, men bare sende (kaste) unntaket videre med throws n Fange unntaket og ha en tom krøll-parentes i catch-delen (Ikke anbefalt) int a (String s) throws NumberFormatException, MinFeil { int i = Integer.parseInt(s); if (i < 10) throw new MinFeil ("FEIL: Tallet er mindre enn 10"); return i; ArrayIndexOutOfBoundsException og NumberFormatException behøver ikke deklareres (dvs. kan utelates fra throws ) 11 12

Unntak strategier, mer detaljert oversikt Flere måter å behandle unntak/avbrudd: 1. Løs problemet og kall metoden som ga unntak om igjen 2. Lapper sammen ting uten å kalle metoden som ga unntak, eller beregn et alternativt ( beste ) resultat istedenfor det unntaksmetoden skulle ha beregnet 3. Avslutt programmet: System.exit(0); 4. Ignorere dem n hvis de er av typen RunTimeException eller Error n hvis de oppstår terminerer programmet Unntak - oversikt, forts. 5. Kaste det videre f.eks. public static void main(...) throws IOException når main kaster en feil videre er det til kjøretidsystemet og programmet terminerer 6. Ta imot / fange det og behandle det ferdig:... farlig kode. catch ( Exception e) {... gjør noe fornuftig og rett opp feilen 7. Ta imot, gjøre noe/litt og så kaste det (eller et annet) videre:... farlig kode. catch ( Exception e ) {... gjør noe fornuftig, f.eks. rett opp litt av feilen og så throw e; 13 14 String-indeks utenfor stringen class Unntak0x { public static void main(string[ ] args) { new Unntak0x ( ); Unntak0x ( ) { String s = "Dette er en tekst med 29 tegn", s1; s1 = s.substring(30,32); // string-indeks utenfor "enden" Behandler Stringindeks-feil class Unntak1x { public static void main(string[ ] args) { new Unntak1x ( ); Unntak1x ( ) { String s = "Dette er en tekst med 29 tegn", s1; s1 = s.substring(30,32); // string-indeks utenfor "enden" catch (StringIndexOutOfBoundsException e) { System.out.println("Her er det noe galt med string-indeksen ); //end try >java Unntak1x Her er det noe galt med string-indeksen 15 16

Eksempel på bruk av unntaksobjektet Fange divisjon med 0 class Unntak2x { public static void main(string[ ] args) { new Unntak2x ( ); Unntak2x ( ) { String s = "Dette er en tekst med 29 tegn", s1; s1 = s.substring(30,32); // string-indeks utenfor "enden" catch (StringIndexOutOfBoundsException e) { System.out.println("Her er det noe galt med string-indeksen " + e.getmessage( )); //end try >java Unntak2x Her er det noe galt med string-indeksen String index out of range: 32 17 public class TryTest { public static void main ( String [ ] args) Her tar programmet { int i=1; seg av hele feilen for (int j=0; j < 5; j++) try{ i = 10/j; System.out.println("Det gikk OK, i:" + i + ", j:" + j); catch (Exception e) { System.out.println("Feil i uttrykk: "+ e.getmessage( )); // end TryTest snidil> java TryTest Feil i uttrykk: / by zero Det gikk OK, i:10, j:1 Det gikk OK, i:5, j:2 Det gikk OK, i:3, j:3 Det gikk OK, i:2, j:4 snidil> 18 Starte å sende feil/unntak selv - eks. n class Feil1 { int i; public static void main(string[] args) { new Feil1().a(null); void a( Feil1 pek) { if (pek == null ) throw new NullPointerException( pek må være!= null"); pek.i = 14; Merk at her kastes et objekt av en klasse som er subklasse av RunTimeException, så da trenger vi ikke try-catch rundt kallet på metoden a Egendefinerte unntak class Mittunntak extends Exception { public Mittunntak ( ) { public Mittunntak (String s) { super(s); // end konstruktører // end class Mittunntak try{... catch (Mittunntak e) {.. e.getmessage( ).. throw new Mittunntak("feilmelding"); Den nye klassen Mittunntak utvider (extends) den ferdiglaget Java-klasse med navn Exception. throw new Mittunntak( ); 19 20

σ σ Eksempel 1: class Mittunntak extends Exception { public Mittunntak ( ) { Fullstendig eks. public Mittunntak (String s) { super(s); import java.io.*; class UnntakEgen { public static void main(string[ ] args) throws IOException { new UnntakEgen ( ); UnntakEgen ( ) throws IOException { BufferedReader mininn = new BufferedReader (new InputStreamReader(System.in)); System.out.println("Skriv et positivt tall?"); String linje = mininn.readline ( ); int tall = Integer.parseInt(linje); if (tall < 0) throw new Mittunntak(linje); System.out.println("Roten av tallet er: " + Math.sqrt(tall)); catch (Mittunntak un) { System.out.println(" Kan ikke finne roten av " + un.getmessage()); // slutt class UnntakEgen 21 Eksempel 2: Konto med OvertrekkUnntak - VIKTIG class Konto { private double saldo = 0, minimumsaldo = 0; private int kontonr; Konto (int nr) { kontonr = nr; public void taut (double belop) throws OvertrekkUnntak { if (saldo - belop < minimumsaldo) { throw new OvertrekkUnntak(Integer.toString(kontonr)); else saldo = saldo - belop; // slutt taut... class OvertrekkUnntak extends Exception { public OvertrekkUnntak (String s) { // slutt Konto super(s); // end class OvertrekkUnntak 22 Bruk av Konto med OvertrekkUnntak class Bank{ static void main (String [] args) { Konto pek = new Konto(234); pek.taut(-10); catch (OvertrekkUnntak e) { System.out.print(" Overtrekk på konto "); System.out.println( e.getmessage()); // slutt catch // slutt main slutt Bank import easyio.*; Flere opplysninger ut av parameteren til catch class Feil3 { public static void main(string[] args) { new Feil3().a(); void a() { b(); void b(){ In tast = new In(); int i = 1, j = 0; while ( i >= 0) { System.out.print("\nDivisjon: 100 delt på: (gi tall):"); i = tast. inint(); Divisjon: 100 delt p : (gi tall):0 FY - deling med null er tull java.lang.arithmeticexception: / by zero at Feil3.b(Feil3.java:19) at Feil3.a(Feil3.java:9) at Feil3.main(Feil3.java:6) Divisjon: 100 delt p : (gi tall): try{ j = 100/ i; System.out.println("Svaret på 100/" + i + " er:" +j); catch (Exception e){ System.out.println("\n FY - deling med null er tull"); e.printstacktrace(); 23 24

Hvilke klasser av feil og unntak har vi i Java Fange flere unntak n Exception unntak (med alle subklassene) n Disse unntakene kan og må vi fange (Unntatt RunTimeException) n F.eks. IOException (kommer vi tilbake til) n RunTimeException (en subklasse av Exception) igjen med sine subklasser som : ArrayIndexOutOfBoundsException, NumberFormatException, ArithmeticException,... n Disse kan, men må vi ikke fange n Vi kan, men må ikke skrive try-catch for disse feilsituasjonene n Vi kan kort sagt ignorere disse (men da terminerer programmet ) n Det ville ellers bli alt for mye..catch (..){... i koden n Eks: Divisjon med 0, en peker er null, gal indeks i en array,.. n Error (med alle subklassene) n Noe galt skjer, vi kan som oftest ikke gjøre noe med det n Eks:.InternalError.OutOfMemoryError, NoClassDefFoundError n Error og Exception er subklasser av Throwable 25 class Unntak3x { public static void main(string[ ] args) { new Unntak3x ( ) ; Unntak3x ( ) { int dividend=7, divisor = 0; int kvotient=0; String s="dette er en tekst med 29 tegn"; String s1="*********"; s1 = s.substring(15,17); // OK string-indeks kvotient = dividend/divisor; // Feil: divisjon med 0 catch (StringIndexOutOfBoundsException e) { System.out.println("Her er det noe galt med string-indeksen"); catch (ArithmeticException e1) { System.out.println("Divisjon med 0: " + e1.getmessage( ) ); //end try-catch System.out.println(s1); System.out.println(kvotient); >java Unntak3x Divisjon med 0: / by zero st 0 26 Nytt Java ord: finally n Vi kan ha flere catch etter hverandre: try{... Kode som kan gi unntak / feile... catch (Type1 t1 ) { catch (Type2 t2 ) {... catch (Type3 t3 ) {... finally { // Dette gjøres alltid - selv om vi ikke får noe unntak n Da testes det (omlag som en switch), og bare den første som får tilslag, blir utført n Husk: At hvis en av klassenavnene (Type1, Type2,..) er superklasse til det innkomne unntaket, vil den blir utført. n Finally vil alltid bli utført enten det ble unntak eller ikke og enten noen av catchene fikk tilslag eller ikke. 27 Motta mange feiltyper - eksempel import easyio.*; class MinFeil extends Exception { MinFeil (String s) { super(s); class Feil7 { int i; int a( String s) throws NumberFormatException, MinFeil{ int i = Integer.parseInt(s); if (i < 10) throw new MinFeil ("FEIL: Tallet er mindre enn 10"); return i; public static void main(string[] args) { int j; j= new Feil7().a(args[0]); System.out.println("RIKTIG: j="+j); catch (ArrayIndexOutOfBoundsException e) { System.out.println("Galt kall på Feil7, bruk:>java Feil7 tall "); catch (NumberFormatException e) { System.out.println("Skriv tall"); catch (MinFeil m) { System.out.println(m.getMessage()); m.printstacktrace(); finally { // Dette gjøres alltid - selv om vi ikke får noe unntak System.out.println("Alltid finally"); 28

IO feil Inn fra tastatur i Java main mininn Hilsen klassedatastruktur n En metode som kan komme til å gjøre en IO-feil må enten behandle dette selv, eller kaste feilen videre: public void minfilleser() throws IOException { import java.io.*; class Hilsen { public static void main (String [] args) throws IOException { BufferedReader mininn = new BufferedReader (new InputStreamReader(System.in)); navn String readline() Objekt av klassen BufferedReader < kode som gjør fil-behandling> 29 System.out.println( Hva heter du?"); String navn = mininn.readline ( ); System.out.println( God dag " + navn ); snidil:>javac Hilsen.java snidil:>java Hilsen Hav heter du? Stein Gjessing God dag Stein Gjessing snidil:> Kaster IOunntak til runtimesystemet 11 konstruktører 47 metoder pluss plass til å lagre en streng (en tekst) Stein Gjessing Et objekt av klassen String 30 Om å lese desimaltall (Utdrag av et program) import java.io.*; BufferedReader mininn = new BufferedReader (new InputStreamreader (System.in)); double tall; String linje; linje = mininn.readline(); tall = Double.parseDouble(linje); // eller: tall = Double.valueOf(linje.trim()).doubleValue(); main mininn String readline() Dette objektet leser fra tastaturet En enkel måte å lese heltall på import java.io.*; BufferedReader mininn = new BufferedReader (new InputStreamReader (System.in)); int tall; String linje; linje = mininn.readline(); tall = Integer.parseInt(linje); DETTE GÅR BRA HVIS LINJEN BARE INNE- HOLDER ET TALL!! Vi husker: Double er en klasse som inneholder mye verktøy som behandler kommatall av typen double. ( Dette har ingen ting med innlesing å gjøre. ) Double Double valueof ( ) double parsedouble ( ) 137 tall linje Integer int parseint ( ) Andre klasser som bl.a. heter Character, Integer, Long og Boolean inneholder metoder for å ta seg av hhv. tegn, heltall (int og long) og logiske verdier. Se i pakken java.lang double doublevalue( ) String klassedatastruktur 137 31 Et objekt av klassen String 32

Innlesing fra fil Java original Først må vi lage en forbindelse med filen: filinn Utskrift til fil - Java original main filut BufferedReader filinn = new BufferedReader (new FileReader ( minfil.txt )); Nå kan vi bruke filen på samme måte som vi leste data fra tastaturet: double dtall; String tekst; dtall = Double.parseDouble(filInn.readLine()); tekst = filinn.readline( ); tekst Dette objektet leser fra filen minfil.txt minfil.txt 123.54 Forelesningene dtall 123.54 PrintWriter filut = new PrintWriter (new FileWriter ( minutfil.txt )); // Utskrift skjer som til skjerm: filut.println( utskrift + 17 ): For at innholdet på den nye filen skal bevares må vi til slutt si: filut.close( ); Dette objektet skriver på filen minutfil.txt void println() minutfil.txt Forelesningene Et objekt av klassen String 33 34 I/O unntak som ikke behandles av programmet Summen av tallene på en fil (nestet try-catch) Når det oppstår et I/O-unntak kan programmet velge å selv ikke behandler det, men kaste det videre til kjøretidsystemet. public static void main(string[] args) throws IOException { BufferedReader filinn = new BufferedReader (new FileReader ("dinfil.txt"));... For eksempel hvis filen ikke finnes: import java.io.*; class Sum { public static void main(string[] args) throws IOException { BufferedReader inn = new BufferedReader (new InputStreamReader (System.in)); BufferedReader filinn = null; String filnavn = null, linje = null; int tall, sum= 0; boolean filskalfinnes = true; while ( filskalfinnes ) { System.out.print("Filnavn: "); filnavn = inn.readline(); filinn = new BufferedReader (new FileReader (filnavn)); // Ikke gjenta fil-åpning mer: filskalfinnes = false; while ( true ) { linje = filinn.readline(); tall = Integer.parseInt(linje); sum += tall; catch (NumberFormatException e) { System.out.println("Summen er: "+sum); catch ( FileNotFoundException e) { System.out.println(filnavn+ " ukent ); System.out.println("Prøv igjen"); // slutt åpne fil løkke // slutt main // slutt klassen Sum 35 36

To alternative EOF -metoder (programmønstre) while ( true ) { linje = filinn.readline(); if (linje == null) throw new EOFException(); tall = Integer.parseInt(linje); sum += tall; catch (EOFException e) { System.out.println ("Summen er: "+sum); linje = filinn.readline(); while ( linje!= null ) { tall = Integer.parseInt(linje); sum += tall; linje = filinn.readline(); System.out.println ("Summen er: "+sum); 3 4 1 2 Eksempel: class In og InExp i easyio public class InExp { BufferedReader in;... public int inint(string sep) throws NumberFormatException, IOException { return Integer.parseInt(inWord(sep)); public String inword(string sep) throws IOException { lineno++; return in.readline(); public class In extends InExp { public int inint() { return inint(null); public int inint(string sep) { for (int i = 0; i < numtry; i++) { return super.inint(sep);... catch (IOException ioe) { feil("inint: " + ioe.getmessage()); return 0; // kompilatormat catch (NumberFormatException nfe) { System.out.print("Forventer et heltall. Prøv igjen: "); // end try-catch 37 38 Oppsummering unntak i Java Hvis det oppstår en feil under kjøring av programmet, kastes det et unntak: throw new Unntaksklasse(); Metoder kan enten kaste unntak videre (throws( )) eller fange opp unntak med try/catch. Dette gjøres ved hjelp av en try/catch-blokk: {...... usikker kode... catch(exceptionnavn e) {... finally {... Unntak kastes oppover i kallkjeden inntil det blir fanget opp. Metoder som kaster unntak videre, må deklare dette ved hjelp av nøkkelordet throws: kastemetode(...) throws ExceptionNavn Metoder som kaster unntak som tilhører RuntimeException-klassen, trenger ikke å deklarere dette. Et unntak som ikke blir fanget opp av en metode underveis, blir til slutt fanget opp av kjøresystemet til Java, som skriver ut relevant informasjon om unntaket og avslutter programmet. Java og C# n Vi har tidligere snakket litt om forskjellene mellom Java og C# n Java er laget av Sun, C# av Microsoft n Det meste er likt n Hendelser håndteres forskjellig n Unntak håndteres rimelig likt, men i C# er du ikke tvunget til å deklarere de unntak som kastets videre (alle unntak I C# fungerer altså slik som runtime-feil i Java) n Alle Microsofts språk kompileres til C# og bruker C#s objektorienterte kjøretidsystem n Java compileres til byte-kode, C# kompileres Just-In-Time (JIT) til maskinkode 40