Forkurs INF1010 Dag 2 Andreas Færøvig Olsen (andrefol@ifi.uio.no) Gard Inge Rosvold (gardir@ifi.uio.no) Institutt for Informatikk, 14. januar 2016
Forkurs INF1010 - dag 2 Feilmeldinger 2
Forkurs INF1010 - dag 2 Feilmeldinger Klasser og pekere Klasser Pekere 2
Forkurs INF1010 - dag 2 Feilmeldinger Klasser og pekere Klasser Pekere Metoder 2
3
Innhold Feilmeldinger Klasser og pekere Klasser Pekere Metoder 4
Feilmeldinger 5
Feilmeldinger Det er to typer feil som kan oppstå under programmering: 5
Feilmeldinger Det er to typer feil som kan oppstå under programmering: Syntaksfeil 5
Feilmeldinger Det er to typer feil som kan oppstå under programmering: Syntaksfeil Kjørefeil 5
Feilmeldinger Det er to typer feil som kan oppstå under programmering: Syntaksfeil Kjørefeil Logiske feil 5
Syntaks og kjørefeil Disse går på det syntaktiske. Det vil si det er disse som gjør java "strengt"og for eksempel passer på at du ikke endrer type på en variabel eller prøver deg på int a = "tallet 2". 6
Python vs. Java De kan minne om feil som oppstår under kjøring i Python: $ python runtimeerror.py Traceback (most recent call last): File "runtimeerror.py", line 1, in <module> print "tallet er " + 2 TypeError: cannot concatenate str and int objects 7
Python vs. Java De oppstår oftest under kompilering i Java: $ javac Feilskaping.java Feilskaping.java:4: error: incompatible types: String cannot be converted to int int a = "tallet 2"; ^ 1 error 8
Python vs. Java Men kan oppstå under kjøring i java også: Exception in thread "main" java.lang.numberformatexception: For input string: "rr" at java.lang.numberformatexception.forinputstring( at java.lang.integer.parseint(integer.java:580) at java.lang.integer.parseint(integer.java:615) at Feilskaping.main(Feilskaping.java:6) 9
Vanlige syntaks og kjørefeil 1. Kompilering: incompatible types 10
Vanlige syntaks og kjørefeil 1. Kompilering: incompatible types variable might not have been initialized 10
Vanlige syntaks og kjørefeil 1. Kompilering: incompatible types variable might not have been initialized cannot find symbol 10
Vanlige syntaks og kjørefeil 1. Kompilering: incompatible types variable might not have been initialized cannot find symbol 2. Under kjøring: NumberFormatException 10
Vanlige syntaks og kjørefeil 1. Kompilering: incompatible types variable might not have been initialized cannot find symbol 2. Under kjøring: NumberFormatException NullPointerException 10
Vanlige syntaks og kjørefeil 1. Kompilering: incompatible types variable might not have been initialized cannot find symbol 2. Under kjøring: NumberFormatException NullPointerException ArrayIndexOutOfBoundsException 10
Logiske feil Feil som ikke kan oppdages under kompilering eller kjøring. Det er altså feil i programmets oppførsel og hvordan det håndterer data/input med tanke på programmets hensikt. 11
Oppgave Hva er den logiske feilen? int min = 0; if (a < b && a < c) { min = a; } else if (b < a && b < c) { min = b; } else { min = c; } System.out.println("min=%d", min); 12
Oppgave int min = 0; if (a <= b && a <= c) { min = a; } else if (b <= a && b <= c) { min = b; } else { min = c; } System.out.println("min=%d", min); 13
Innhold Feilmeldinger Klasser og pekere Klasser Pekere Metoder 14
Objektorientert programmering Vi modellerer virkelige objekter. Objekter har to typer egenskaper: 15
Objektorientert programmering Vi modellerer virkelige objekter. Objekter har to typer egenskaper: Data som beskriver objektet. 15
Objektorientert programmering Vi modellerer virkelige objekter. Objekter har to typer egenskaper: Data som beskriver objektet. Handlinger som objektet kan utføre. 15
Spørsmål 16
Spørsmål Hvilke data og handlinger er nyttige for en bil å ha? 16
Klasse Definisjon En klasse er mønsteret (oppskriften) til et objekt. Klassen beskriver en mengde objekter med lik oppførsel. 17
Klasse Definisjon En klasse er mønsteret (oppskriften) til et objekt. Klassen beskriver en mengde objekter med lik oppførsel. I klassen bruker vi ulike variable for å representere objektets data, og metoder for å representere handlingene objektet kan utføre. 17
Spørsmål 18
Spørsmål Hvilke variabler og metoder er nyttige for en bil-klasse? 18
En klasse for en sirkel I INF1100 møtte dere på følgende klasse: class Circle: def init (self, x0, y0, R): self.x0, self.y0, self.r = x0, y0, R def area(self): return pi*self.r**2 def circumference(self): return 2*pi*self.R 19
En klasse for en sirkel I Java ser denne slik ut: class Circle { private double x0; private double y0; private double R; public Circle(double x0, double y0, double R) { this.x0 = x0; this.y0 = y0; this.r = R; } 20
En klasse for en sirkel (fortsettelse) public double area() { return 2*Math.PI*R*R; } public double circumference() { return 2*Math.PI*R; } 21
En klasse for en sirkel (fortsettelse) public double getr() { return R; } public double getx0() { return x0; } } public double gety0() { return y0; } 22
Bruk av klassen Python: c = Circle(2, -1, 5); print A circle with radius %g at (%g, %g) has area %g % (c.r, c.x0, c.y0, c.area()) 23
Bruk av klassen Python: c = Circle(2, -1, 5); print A circle with radius %g at (%g, %g) has area %g % (c.r, c.x0, c.y0, c.area()) Java: class Main { public static void main(string[] args) { Circle c = new Circle(2, -1, 5); System.out.printf("A circle with radius %g at (%g, %g) has area %g\n", c.getr(), c.getx0(), c.gety0(), c.area()); } } 23
Spørsmål 24
Spørsmål Gitt følgende klasse: class Person { private String navn; public Person(String navn) { this.navn = navn; }} Hvilke av setningene under er lovlige? 1. Person p = new Person(); 2. p.navn = Gard ; 3. Person p = new Person( Andreas ); 24
Spørsmål Gitt følgende klasse: class Person { private String navn; public Person(String navn) { this.navn = navn; }} Hvilke av setningene under er lovlige? 1. Person p = new Person(); 2. p.navn = Gard ; 3. Person p = new Person( Andreas ); 24
Bruk av klasser 25
26
Oppgave 27
Oppgave Lag klasser for trekanter og firkanter. De skal ha nyttige variabler og metoder som regner ut areal og omkrets. 27
Oppgave Lag klasser for trekanter og firkanter. De skal ha nyttige variabler og metoder som regner ut areal og omkrets. 27
Pekere Circle c = new Circle(0,0,5); c er en peker til Circle-objektet. 28
Pekere Circle c = new Circle(0,0,5); c er en peker til Circle-objektet. Pekeren er en minneadresse som forteller oss hvor objektet er lagret. 28
Pekere Circle c = new Circle(0,0,5); c er en peker til Circle-objektet. Pekeren er en minneadresse som forteller oss hvor objektet er lagret. En peker som ikke peker på noe har verdien null. 28
Pekere Circle c = new Circle(0,0,5); c er en peker til Circle-objektet. Pekeren er en minneadresse som forteller oss hvor objektet er lagret. En peker som ikke peker på noe har verdien null. Typisk feil: NullPointerException. 28
Spørsmål 29
Spørsmål NullPointerException får vi når 1. Vi deklarerer en peker uten å gi den verdi: Person p; 2. Vi prøver å aksessere data i en peker som ikke har fått noen verdi: Person p; p.hentnavn(); 3. Vi prøver å konvertere en tom tekst til et tall: int a = Integer.parseInt( ); 29
Spørsmål NullPointerException får vi når 1. Vi deklarerer en peker uten å gi den verdi: Person p; 2. Vi prøver å aksessere data i en peker som ikke har fått noen verdi: Person p; p.hentnavn(); 3. Vi prøver å konvertere en tom tekst til et tall: int a = Integer.parseInt( ); 29
Innhold Feilmeldinger Klasser og pekere Klasser Pekere Metoder 30
Metoder En metode er en funksjon knyttet til en klasse. En metode definerer hvilke handlinger som kan utføres i en klasse. En samling programsetninger knyttet til et navn. 31
En metode Python: def f2c(self, f): return (5.0/9)*(f-32); 32
En metode Python: def f2c(self, f): return (5.0/9)*(f-32); Java: public double f2c(double f) { return (5.0/9)*(f-32); } 32
Bruk av metoden Alle metoder i Java må legges inn i en klasse: class TempConverter { public double f2c(double f) { return (5.0/9)*(f-32); } } 33
Bruk av metoden Alle metoder i Java må legges inn i en klasse: class TempConverter { public double f2c(double f) { return (5.0/9)*(f-32); } } Kall på metoden fra main: class Main { public static void main(string[] args) { TempConverter tempconv = new TempConverter(); double celsius = tempconv.f2c(20); System.out.println(celsius + " C"); } } 33
Oppgave 34
Oppgave Hva mangler? [returverdi] sum(){ double a = 2.0; int b = 3; return a + b; } 1. int 2. double 3. void 34
Oppgave Hva mangler? [returverdi] sum(){ double a = 2.0; int b = 3; return a + b; } 1. int 2. double 3. void 34
Oppgave 35
Oppgave Finn feilene i følgende metode: public void sum(int[] array) { int sum = 0; for(int i = 0; i < array.length: i++) { sum += array{i}; } return sum; } 35
Fasit public int sum(int[] array) { int sum = 0; for(int i = 0; i < array.length; i++) { sum += array[i]; } return sum; } 36
Oppgave 37
Oppgave Finn feilene i følgende metode: public int minmax(int[] a) { int min = a[0]; int max = a[0]; for (int i: a) { if (i < min) { min = i; } if (i > max) { max = i; } } return min, max; } 37
Fasit public int[] minmax(int[] a) { int min = a[0]; int max = a[0]; for (int i: a) { if (i < min) { min = i; } if (i > max) { max = i; } } int[] returnvalues = {min, max}; return returnvalues; } 38
Oppgave 39
Oppgave Skriv en metode som finner det største av tre tall: a, b og c og returnerer verdien av det. Du kan ikke anta at tallene har ulike verdier. 39
Oppgave Skriv en metode som finner det største av tre tall: a, b og c og returnerer verdien av det. Du kan ikke anta at tallene har ulike verdier. public int max(int a, int b, int c) { } 39
Oppgave Skriv en metode som finner det største av tre tall: a, b og c og returnerer verdien av det. Du kan ikke anta at tallene har ulike verdier. public int max(int a, int b, int c) { } 39
40
41
Mer lesestoff Java tutorials: Klasser og objekter Arrayer Marit Nybakkens notater: Objekter Konstruktører Metoder 42