Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Objektorienterad programvaruutveckling GU (DIT011) Föreläsning 3 Innehåll Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList. Föreläsning 3 Katarina Blom 1 2 Fel, fel, fel.. Att skriva datorprogram är inte helt trivialt, och man gör ofta en del misstag... Tre kategorier av fel förekommer: Kompileringsfel: Fel som uppstår om man inte följer språkets regler (syntax). Felen upptäcks av kompilatorn. Exekveringsfel: Fel som uppstår vid körningstillfället. Programmet kan inte fortsätta normalt när det exekveras. Logiska fel: Programmeraren har tänkt fel när programmet skrevs (tex. löst ett problem felaktigt, använt fel algoritm) och resultaten blir felaktiga. Metoder: Exempel: En klass för bankkonton Insättning. Uttag. Avläsning av saldo. Tillståndsvariabler: Saldot på kontot. 3 4
Första försöket public void taut(double sum){ saldo = saldo - sum; public double avlässaldo(){ return saldo; Förvillkor Det är vanligt att metoder har bivillkor på parametrarnas värden. Sådana förvillkor bör (minst) dokumenteras i kommentaren till metoden. /** * sätter in sum kronor på kontot. * @param sum summan som ska sättas in. * Om sum < 0 är resultatet odefinierat. */. Vad kan gå fel? 5 6 Andra försöket if(sum>=0) else????? Exceptions När indata till en metod är felaktiga (eg. förvillkoren är inte uppfyllda) bör man: Helst inte göra en felutskrift (ok. i debuggsammanhang, men ofta inte i det färdiga programmet). Helst inte i det tysta försöka göra något åt situationen Tex. Generera ett Exception. I vilken del av programmet kan felet åtgärdas? 7 8
Tredje försöket if(sum>=0) else throw new IllegalArgumentException(); Exceptions Java använder sig av exceptions. >> java Main Exception in thread "main" java.lang.arrayindexoutofbounds- Exception: 0 at Main.main(Main.java:3) - - - - - - - - - - - - - - - - - - - - - - - - - - Vad händer om satsen efter else exekveras? public class Main{ public static void main(string[] a){ System.out.println(a[0]); 9 10 Exekveringsfel Exekveringsfel kan delas in i två grupper: 1: Felprogrammeringar. Exempelvis: - Metoder anropas felaktigt (tex. Metodanrop där förvillkoren till metoden inte är uppfyllda) - Indexera utanför ett fält (fält: se slutet av denna föreläsning). Åtgärd: Programmera felfritt. 2: Fel som beror på yttre omständigheter. Exempelvis: - Programmet används fel av en användare (tex. vid in- och ut- matning) - Brist på minne, eller filer som inte finns. Åtgärd: Olika från fall till fall. 11 Checked och Unchecked Exceptions Exceptions i Java delas in i två grupper: 1: Unchecked Exceptions (behöver inte deklareras). Beror ofta på felaktigheter i själva programmet. Exempelvis: - IllegalArgumentException - ArrayIndexOutOfBoundException 2: Checked Exceptions (behöver deklareras). Beror ofta på yttre omstädigheter, eller att programmet används felaktigt. Exempelvis: - FileNotFoundException - IOException 12
Variabler Det finns olika sortes variabler: o Tillståndsvariabler o Lokala variabler o Statiska variabler (ofta konstanter) o Parametrar Var i programmet är de synliga? Vilken livstid har de? Hur initieras de? Tillståndsvariabler o Synlighet: I klassen (om private) o Livstid: Från dess att objektet av klassen skapas tills ingen referens till objektet finns kvar. o Initieringsvärde beror av typen på tillståndsvariabeln: int eller double: 0 boolean: false Klasstyp: null 13 14 Tre sätt att initiera tillståndsvariabler o Variabeln deklareras utan att ges ett värde (den får då standardvärdet). o Variabeln deklareras och ges ett startvärde. o Variabeln ges startvärde i konstruktorn. public BankKonto(double s){ saldo = s; Lokala variabler public class Nonsens{ private int t; public void order(int s1, int s2){ int tmp = s1; s1 = s2; s2 = tmp; o Synlighet: I blocket där den deklarerats. o Livstid: Minne allokeras vid varje metodanrop, avallokeras när metoden exekverat klart. o Initieringsvärde Måste initieras explicit. Kompilatorn kontrollerar så att initiering gjorts. 15 16
(Explicita) Parametrar public double avlässaldo(){ return saldo; o Synlighet: Hela metodens kropp. o Livstid: Minne allokeras vid varje metodanrop, avallokeras när metoden exekverat klart. o Initieringsvärde Värdet av metodanropets argument beräknas och lagras i minnescellen. (Implicita) Parametrar Varje objekt som skapas har en implicit parameter this. Denna initieras (vid tex. metodanrop) till att referera till det objekt vars metod anropats. När tillståndsvariabler refereras till i metoder syftar de på variablerna i objektet this. public BankKonto(double saldo){ this.saldo = saldo; 17 18 Parameteröverföring Exempel 1 public class Nonsens{ public void order(int s1, int s2){ int tmp = s1; s1 = s2; s2 = tmp; public class NonsensMain{ public static void main(string[] ar){ int a=7, b=13; Nonsens n = new Nonsens(); n.order(a,b); System.out.print("a = "+a); System.out.println(" b = "+b); Vad blir utskriften? 19 ParameteröverföringExempel 2 public class Par{ private int a, b; public int geta(){return a; public int getb(){return b; public void puta(int a){this.a = a; public void putb(int b){this.b = b; public class Nonsens{ public static void order(par s){ int tmp = s.getb(); s.putb(s.geta()); s.puta(tmp); public static void main(string[] a){ Par p = new Par(); p.puta(7); p.putb(13); order(p); System.out.print(p.getA()+" "+p.getb()); Vad blir utskriften? 20
Statiska variabler public static final double pi = 3.14; Fält Skapa ett fält med 5 heltalsvariabler: int[] a = new int[5]; En static-deklarerad variabel är gemensam för alla objekt av klassen. a a[0] a[4] Vanligt att konstanter är static finaldeklarerade. Synlighet private: endast inom klassen. public: också från andra klasser. Livstid Från det att klassen laddats in. (Tills programmet avslutats). a[3]=4; a a[0] 4 a[4] Initiering måste initieras explicit. (a:s typ är int[]). 21 22 Egenskaper hos fält o Alla element har samma typ. o Fältets storlek (dvs. antalet element) bestäms när fältet skapas. o Index börjar med 0 (alltid). o Fältelementet initieras på samma sätt som tillståndsvariabler. o Antalet element i fältetages ava.length. Mer om fält Fält kan fyllas med värden vid deklarationen. Fältets storlek bestämms då av antalet värden. int[] days = {31,28,31,30,31,30, 31,31,30,31,30,31; Att genomlöpa ett fält int sum = 0; for(int i=0;i<days.length;i++){ sum = sum+days[i]; Använd days.length även om du vet antalet element 23 24
Fält som parameter public static int countzeros(int[] a){ int count = 0; for(int i=0;i<a.length;i++) if(a[i]==0) count = count + 1; return count; Det går också att returnera fält public static int[] reverse(int[] a){ int[] temp = new int[a.length]; for(int i=0;i<a.length;i++) temp[a.length-1-i] = a[i]; return temp; Hur kan man skriva metoden utan den lokala variabeln temp? Kan användas på fält av vilken storlek som helst I parametern skickas referensen till fältet 25 26 Fler exempel på fält Inuti klassen Box: public class Box{ private static final int MAXBALLS=100; private Ball[] theballs = new Ball[MAXBALLS]; private int ballcount = 0; public void addball(ball b){ theballs[ballcount] = b; ballcount++; Observera! String är inte ett fält av tecken. public static int countchr(string s, char c){ int count = 0; for(int i=0;i<s.length();i++){ if(s.charat(i)==c) count = count + 1; return count; Fält av String som parameter till main: public static void main(string[] arg){ 27 28
Om man inte vet på förhand hur många element som behövs? Ett fält har en bestämd storlek som inte kan utökas utan vidare. Ta i så att det säkert räcker. Använd en färdig klass som tillåter godtyckligt många element. Tex. java.util.arraylist. Klassen java.util.arraylist innehåller bla. metoderna: public void add(e e) (Objekt av vilken klass som helst är ok. här) public int size() public E get(int index) Box med ArrayList import java.util.arraylist; public class Box{ private ArrayList<Ball> theballs = new ArrayList<Ball>(); /*ballcount behövs inte längre. Anropet theballs.size() ger antalet element som har satts in. private int ballcount = 0; */ public void addball(ball b){ theballs.add(b); Observera syntaxen när man skapar objekt av ArrayList 29 30