Jentetreff INF1000 Debugging i Java

Like dokumenter
Løsningsforslag ukeoppg. 7: okt (INF Høst 2010)

Løsningsforslag ukeoppg. 8: okt (INF Høst 2011)

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

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

INF1000: Forelesning 7. Konstruktører Static

IN Notat om I/O i Java

Løsningsforslag ukeoppg. 2: 31. aug - 6. sep (INF Høst 2011)

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

Fra Python til Java, del 2

INF1000: Forelesning 7

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

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

INF Notat om I/O i Java

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

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

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

Kapittel 8: Programutvikling

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

UNIVERSITETET I OSLO

Feilmeldinger, brukerinput og kontrollflyt

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

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

INF Uke 10. Ukesoppgaver oktober 2012

UNIVERSITETET I OSLO

Ukeoppgaver 1: 30. aug 3. sep (INF Høst 2010)

Leksjon 7. Filer og unntak

UNIVERSITETET I OSLO

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

INF1000-SIKT - Notat om I/O i Java

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

INF Obligatorisk innlevering 5

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

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

UNIVERSITETET I OSLO

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

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

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

Seminaroppgaver IN1010, uke 2

INF1000. Marit Nybakken 10. februar 2004

INF1000 Metoder. Marit Nybakken 16. februar 2004

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

UNIVERSITETET I OSLO

Java. INF1000 : Forelesning 2. Ulike varianter for ulike behov. Java Standard Edition (Java SE) Java:

Dagens tema Kapittel 8: Objekter og klasser

INF1010 våren 2018 tirsdag 23. januar

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

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

Repetisjon. INF gruppe 13

UNIVERSITETET I OSLO

Videregående programmering 6

INF1000: noen avsluttende ord

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

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

INF Løsning på seminaropppgaver til uke 8

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

Forelesning inf Java 4

Oblig4 - forklaringer. Arne og Ole Christian

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

UNIVERSITETET I OSLO

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

Dagens tema: 12 gode råd for en kompilatorskriver

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

De neste ukene. INF1000 Uke 12. Prøveeksamen. Nå - Prøveeksamen. Forelesning om IT og samfunn neste uke (13/11).

INF1000 : Forelesning 4

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

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

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

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

INF1000 : Forelesning 2

UNIVERSITETET I OSLO

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

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

INF1000: Forelesning 6. Klasser og objekter del 1

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

TOD063 Datastrukturer og algoritmer

Del 3: Evaluere uttrykk

Fullstendige programeksempler. INF1000 : Forelesning 2. Eksempel 1. Eksempel 2. Vi skal nå se på endel programeksempler.

UNIVERSITETET I OSLO

INF1010 Tråder J. Marit Nybakken Motivasjon. Å lage en tråd

Løse reelle problemer

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

Oblig 4Hybelhus litt mer tips enn i oppgaven

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Forelesning inf Java 2

Forelesning inf Java 2

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

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

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

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Argumenter fra kommandolinjen

UNIVERSITETET I OSLO

MAT-INF 1100: Obligatorisk oppgave 1

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

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

Forelesning inf Java 5

Forelesning inf Java 5

Transkript:

Jentetreff INF1000 Debugging i Java Ingrid Grønlie Guren ingridgg@student.matnat.uio.no 11. november 2013 Kort om feilmeldinger i Java Java har to ulike type feilmeldinger som man kan få når man skriver programmer i Java. Den ene typen feilmeldinger er kompileringsfeil som Java oppdager når programmet kompileres, altså etter at det er skrevet > javac Oppgave.java Da leser"java raskt gjennom koden som er skrevet, og ser om det gir mening fra Javas perspektiv. Den andre feilmeldingstypen kommer når Java prøver å kjøre programmet. Da kan det hende at det som er skrevet ikke lenger gir mening, og Java gir ut feilmeldinger. Kort om kompileringsfeil Klassiske kompileringsfeil er når Java prøver å lese et program og finner feil som ikke gir mening i programmet. Her kan det være snakk om variable som programmereren prøver å bruke, men som ikke er definert i kodedelen, eller variable som overhode ikke finnes i programmet. En annen kompileringsfeil er hvis vi prøver å lagre informasjon i variable uten at det stemmer overens, feks på linje 3 int i = 2.0; Her vil vi få en kompileringsfeil fordi Java vet at 2.0 er et desimaltall og å lagre dette i en int vil miste informasjon. Derfor er feilmeldingen vi får Feil.java:3: error: possible loss of precision int i = 2.0; ^ required: int found: double 1

Kort om kjørefeil Kjørefeil er feil som Java ikke kan teste før vi prøver å kjøre programmet, for eksempel om vi prøver å hente ut array-verdier utenfor lengden til arrayen, eller om vi prøver å gjøre noe på et objekt som er null. I utgangspunktet kunne mange av disse feilmeldingene bli plukket opp allerede ved kompileringen, men krever ekstra sjekk og er derfor lagt til selve kjøretiden. Som gir oss feilmeldingen int[] array = new int[2]; System.out.println(array[4]); >java Feil Exception in thread "main" java.lang.arrayindexoutofboundsexception: 4 at Feil.mail(Feil.java:4) Håndtering av feilmeldinger Som oftest er det sånn at når vi får en feilmelding i Java som ikke skal skje, må vi endre på koden vår slik at feilmeldingen ikke oppstår. Hvis vi kommer utenfor arrayen er det mest sannsynlig en logisk brist vi må fikse. Likevel er det nnoen feilmeldinger som er skrevet sånn at de umiddelbart kan eller må håndteres. Når vi leser fra fil med Scanner vet Java allerede ved kompilering at det er mulig at det går feil. Derfor er vi nødt til å bruke try og catch. Her prøver vi koden som kan gå galt i try, og hvis det ikke går vil java kasteen feilmelding som blir tatt i mot i catch. Slik bruker vi dette try{ Scanner scan = new Scanner(new File(filnavn)); catch(ioexception e){ System.out.println("Egendefinert feilmelding som forklarer hva problemet er"); Oppgave 1 Finn feilene i følgende program og foreslå hvordan de kan rettes. Programmet består av to klasser: Student, som bare har én objektvariabel: navn; og Gruppe, som har en array med opptil 40 studenter og en konstruktør med programkode som illustrerer bruk av klasser og objekter. class Student { String navn; class Gruppe { Student[] studenter = new Student[40]; // Array med Student-objekter int antstudenter; // Antall plasser i arrayen over som er i bruk public static void main(string[] args) { 2

Gruppe g = new Gruppe(); skrivantall(); /* Spørsmål: * a) Hvorfor gir linjen over følgende feilmelding? Hvordan unngå det? * Gruppe.java:12: non-static method skrivantall() cannot * be referenced from a static context * skrivantall(); * ^ Gruppe() { // b) Den vanligste feilmeldingen i Java er "cannot find symbol". // Følgende linje gir feilmeldingen vist under. Hva er feil i dette // tilfellet, og hvordan kan vi rette det? antallstudenter = 0; /* Gruppe.java:32: cannot find symbol * symbol : variable antallstudenter * location: class Gruppe * antallstudenter = 0; * ^ // c) Følgende linje gir "NullPointerException" her. Hvilken setning // har vi glemt å utføre før dette? (Husk at studenter[] er en array) studenter[antstudenter].navn = "Trine"; antstudenter++; * // d) Skriv det som mangler for at studenter[1].navn skal bli "Martin". Student s1 = new Student(); s1 = "Martin"; studenter[antstudenter++] = ; // e) Hva mangler her for at if-testen skal kunne gi true? System.out.println(true); // f) Hvorfor gir følgende løkke NullPointerException på linjen med // System.out..? (anta at eneste kode som er blitt utført når // programmet kommer hit er det som står i linjene over, med feilene // rettet). Også, hvordan kan betingelsen i første linje endres for å // unngå NullPointerException? Tips: Tenk arrayplasser og!= null. Student s2 = studenter[i]; System.out.println(s2.navn); 3

// g) Finn en annen måte å unngå NullPointerException her uten å endre // første linje under, men ved å legge til en if-setning inne i løkka: Student s3 = studenter[i]; System.out.println(s3.navn); // h) Hvorfor gir følgende linje i programkoden denne feilmeldingen: // ArrayIndexOutOfBoundsException: 40 studenter[40] = new Student(); // i) Hva vet vi om uttrykket merkert med " " på neste linje hvis // linjen gir feilmeldingen "ArrayIndexOutOfBoundsException: -1": s1 = studenter[ ]; // j) Hva er feil her? Feilmeldingen dette gir er: // Gruppe.java:103: incompatible types // found : java.lang.string // required: Student studenter[2] = "Eva"; // k) Hva er feil her? Feilmeldingen er: cannot find symbol // symbol : constructor Student(java.lang.String) Student lars = new Student("Lars"); // l) Hva er feil her? Feilmeldingen dette gir er: // Gruppe.java:114: incompatible types // found : int // required: boolean if (antstudenter = 0) { system.out.println("ingen student registrert!"); // m) Hvorfor klager Java også med: "package system does not exist"? // n) Når vi har rettet alle feilene i a) til m) ovenfor, så gir fortsatt // if-setningen under NullPointerException. Hvordan unngår vi det? boolean funnet; Student stud = studenter[i]; if (stud.navn.equals("eva")) { funnet = true; System.out.println(stud.navn); // o) Løkken ovenfor stopper ikke når navnet "Eva" blir funnet. // Hvordan kan vi få løkken til å stoppe når navnet blir funnet? 4

// p) Løkken ovenfor gir ingen melding til bruker når navnet ikke blir // funnet. Hvordan kan vi programmere utskrift av en slik melding? // Og hvordan kan vi unngå at Java da skal klage om at "variable // funnet might not have been initialized"? // q) Anta at navnet til studenter[2] er "Eva". Hvorfor endrer ikke // følgende kode navnet til studenter[2]? Hvordan kan det ordnes? // (slik at studentobjektet i "ny" overføres til studenter[2]). Student ny = new Student(); Student studpeker; ny.navn = "Heidi"; studpeker = studenter[2]; studpeker = ny; void skrivantall() { System.out.println("Antall studenter: " + antstudenter); // r) Hvorfor får vi feilmeldingen: "<identifier> expected" på denne linjen: System.out.println("Slutt"); 5