Felhantering. Andra brott mot språkets regler. Man kan också i programmet bryta mot ett antal olika regler som gäller. Exempelvis:

Relevanta dokument
Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Att skriva till och läsa från terminalfönstret

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Föreläsnings 9 - Exceptions, I/O

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Villkor och tester. Utförande satser bygger upp metoderna, man brukar finindela detta i: sekvenser. Ett program består i princip av: selektioner (val)

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Testning av program. Verklig modell för programutveckling

Objektorienterad Programmering (TDDC77)

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Fält av referenser. Konstruktorerna används för att skapa Bilar och Trafikljus.

Objektorienterad programmering i Java

Klassdeklaration. Metoddeklaration. Parameteröverföring

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

F4. programmeringsteknik och Matlab

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Tentamen. Lösningsförslag

Undantagshantering. Fördjupad Java. Fel. Undantag. Fånga Undantag. Grupper av Undantag

Undantagshantering. Fördjupad Java. Undantag. Fel. Grupper av Undantag. Fånga Undantag

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

//Använd main som ett "handtag" för att hålla ihop programmet. //Själva programmet finns i övriga klasser.

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Tentamen FYTA11 Javaprogrammering

Föreläsning 2, vecka 8: Repetition

SMD 134 Objektorienterad programmering

Föreläsning 6: Metoder och fält (arrays)

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

JAVAUTVECKLING LEKTION 7

Fördjupad Java. Undantagshantering. Fel

Föreläsning 3-4 Innehåll

List.java. List.java. Printed by Tom Smedsaas

JAVA Mer om klasser och objektorientering

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

Lösningsförslag, tentamen FYTA11 Javaprogrammering

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Kompilera och exekvera Javakod

Testning och felhantering

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Felhantering TDDD78, TDDE30, 729A

Exceptions (undantag) Murach s: kap 7

Tentamen , Introduktion till Java, dtaa98, dtea53

OOP Objekt-orienterad programmering

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Del A (obligatorisk för alla)

JAVAUTVECKLING LEKTION 4

Tentamen , Grundläggande programmering i Java

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Objektorienterad programmering

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

TDDC77 Objektorienterad Programmering

TDDC77 Objektorienterad Programmering

TENTAMEN OOP

Grundläggande programmering med C# 7,5 högskolepoäng

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Föreläsning 14. Filhantering

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Tentamen OOP

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

1 Comparator & Comparable

Dagens program. Programmeringsteknik och Matlab. Viktiga datum. Ett första exempel. Programmall, vad behöver vi i ett javaprogram?

Klasshierarkier - repetition

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Mer källkod. Styrstrukturer Val Slingor Operatorer Källkodsexempel med minne. Erik Forslin. Rum 1445, plan 4 på Nada

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Obligatorisk uppgift: Numerisk kalkylator

Lösningar för tenta 2 DAT043,

Programmering A. Johan Eliasson

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

LÖSNINGSFÖRSLAG TILL TENTAMEN PROGRAMMERINGSMETODIK MOM2 - JAVA, 4P.

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

DAT043 Objektorienterad Programmering

"if"-satsen. Inledande programmering med C# (1DV402)

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

C++ Objektorientering - Klasser. Eric Elfving

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Recitation 4. 2-D arrays. Exceptions

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Transkript:

Felhantering I de flesta program finns eller uppstår ett antal olika fel. Man behöver en strategi för att hitta och rätta till sådana fel. Olika typer av fel som kan inträffa: syntaktiska fel Olika form av felaktig syntax, dvs brott mot de regler som beskriver hur språket ska se ut. Ex: dobble x = 2; // dobble finns inte som typ int b = true; // true är inte ett heltal b = a! b 2; //! och felaktiga Andra typiska sådana här fel är att glömma att deklarera variabler, glömma att ge dem startvärden och felstavningar av olika namn. Andra brott mot språkets regler Man kan också i programmet bryta mot ett antal olika regler som gäller. Exempelvis: double a = -2; System.out.println(Math.sqrt(a)); // a < 0!! int [] arr = new int[100]; for (int i=1; i <=100; i++) arr[i] = 0; // fel index! int p = 1; // beräkna 20! for (int i=1; i<=20; i++) p = p*i; // för stora tal double tal= 4.5, n = 0; System.out.println( kvot =, a/n); // nämnare 0! De flesta av dessa (men inte alla) avbryter programmet med en felutskrift. Sådana här fel upptäcker kompilatorn (javac) och ger ett felmeddelande vid kompilering. Felhantering 21 March 2002 1 Felhantering 21 March 2002 2 Logiska fel (tankefel) Programmet är tekniskt sett korrekt men gör fel saker, t. ex. räknar fel eller gör nåt annat som det inte borde göra, exempelvis skickar vattenräkningar på 2 miljarder kronor. Exempelvis: Fel på kompilatorer, javamaskinen eller datorn Händer ibland men inte nåt förstahandsproblem. Såna fel kan man ju inte göra så mycket åt annat än att byta dator, systemversion, javaversion eller nåt sånt. // // kontrollerar inte en inmatings giltighet. // här accepteras tex en längd av -7 meter // int längd; Std.out.println( Huru lång är min Herre? ); längd = Std.in.readInt(); Std.out.println( Längd: + längd); // hitta största värdet i en array // int [] arr = new int[200]; // ge värden till alla element i arr int max = arr[0]; for (int i=1; i < 200; i++) { if (arr[i] < max) max = arr[i]; Std.out.println( Största värde är: + max); // ger minsta värde, inte största Felhantering 21 March 2002 3 Felhantering 21 March 2002 4

Vad göra åt felen? Syntaxfel rättas till det gäller att lära sig att förstå vad kompilatorn meddelar och kunna relatera det till sitt program. import extra.*; public class AddSub { public static void main(string [] args) { double a; // fråga efter ett värde på a Std.out.proint("Ge a s värde ); a = Std.in.readDouble(); // fråga efter ett värde på b Std.out.print("Ge b s värde "); b = Std.in.readDouble(); // räkna ut summa och skillnad double sum,diff; sum = a + b; diff = a - b; // skriv ut Std.out.printnl("Summan blev " + sum + " skillnaden blev " + diff); Kompilera detta >Javac AddSub.java AddSub.java:9: unclosed string literal Std.out.proint( Ge a s värde ); AddSub.java:10: ) expected a = Std.in.readDouble(); AddSub.java:15: cannot resolve symbol symbol : variable b location: class AddSub b = Std.in.readDouble(); AddSub.java:20: cannot resolve symbol symbol : variable b location: class AddSub sum = a + b; AddSub.java:21: cannot resolve symbol symbol : variable b location: class AddSub diff = a - b; AddSub.java:25: cannot resolve symbol symbol : method printnl (java.lang.string) location: class extra.extendedwriter Std.out.printnl( Summan blev + sum + 6 errors > Felhantering 21 March 2002 5 Felhantering 21 March 2002 6 De flesta andra brott mot språkets regler leder till av programmet avbryts med en felutskrift. Man kan få en hel del information ur denna utskrift. Exempel: public class Noll { private int a, b; public Noll() { a = 0; b = 0; public Noll(int a, int b) { this.a = a; this.b = b; public int kvot() { return a/b; public static void main(string [] args) { Noll n = new Noll(4,0); System.out.println(n.kvot()); Hur lagar jag mina trasiga program? Generell metod som ofta fungerar: I mån av tillgång, använd huvudet. Andra bra metoder: Titta på programmet och förklara för någon annan vad det gör. Lägg in utskrifter i programmet som hjälp att förstå vad det gör Använd mer avancerade felsökningshjälpmedel, avlusare av olika slag. javac Noll.java java Noll Exception in thread main java.lang.arithmeticexception: / by zero at Noll.kvot(Noll.java:13) at Noll.main(Noll.java:19) Felhantering 21 March 2002 7 Felhantering 21 March 2002 8

Varför producerar man felaktiga program? Programspråk är ganska abstrakta, kan vara svårt att formulera sig på ett naturligt sätt Komplicerade algoritmer kan vara svåra att få korrekta Komplexiteten växer snabbt med programstorleken. Det gör att problemen snabbt växer dig över huvudet. Inmatning är svår att hantera på ett säkert sätt Slutsatser av detta? Arbeta med moduler som är små och som har en väldefinierad uppgift. Då är felmöjligheterna färre och storleken gör det hela hanterbart. Testa varje del innan du fortsätter med nästa. Eftersom varje modul i Java är en eller annan klass så innebär detta att skriva ett huvudprogram i klassen. Felhantering 21 March 2002 9 Felhantering 21 March 2002 10 Var ska jag börja? Börja med de enklaste klasserna, exempelvis kan vi i partikelproblemet börja med en vektorklass. Utveckla den och testa den. Bygg sedan nästa klass om använder denna och fortsätt att testa. Detta sätt att arbeta nedifrån och upp kallar vi på god svenska bottom-up. Fördelen är att det är enkelt att bygga en bit i taget och enkelt av testa. Nackdelen är att det kan vara svårt att ha en vision om hur det färdiga systemet ser ut. Alternativt kan man börja på en övergripande nivå. I partikelexempet börjar vi då med en simulering av det hela. Skapa en box full med partiklar, skapa sedan en simuleringsloop. När vi gjort detta måste fundera över hur det ska gå till att skapa boxen m. m. Fördelen med detta är att vi får en klar bild av hur det hela är tänkt att fungera i grova drag. Svårigheten är att testa på ett bra sätt. För att kunna göra detta måste man tillhandahålla dummies för detaljerna tills dess man skrivit skarpa moduler. Denna metod kallas på lika god svenska top down. Felhantering 21 March 2002 11 Felhantering 21 March 2002 12

Tänk först, programmera sedan! När man bygger ett hus så börjar man inte spika lite nåt hörn på måfå för att sen se vad det kan bli för något, man startar med att göra en ritning. När man skriver ett program så utgår man från ett problem som ska lösas. Innan kod skrivs måste en lösning av problemet skapas och skrivas ned. En analys av lösningen och uppdelning i olika moduler ska göras. Modulernas innehåll ska skissas och en kontroll av lösningens korrekthet måste göras. Det finns formella metoder att göra detta OOADmetoder, det finns också speciella verktyg att dokumentera detta. I enkla problem duger enklare metoder. Felsökning: Om vi nu tömt ut alla intellektuella möjligheter för felsökning så återstår mera tekniska metoder. Att lägga in utskrifter är en bra metod. Det gäller att veta vad som är viktigt och relevant för problemet. Ingen blir lycklig av att få hundratals sidor med lustiga siffror. Man kan studera programflödet genom att helt enkelt lägga in små testutskrifter på olika ställen i programmet.då kan man spåra datorns framfart i koden och se hur programmet utförs. Man kan studera vissa variabler och skriva ut deras värde på olika ställen för att se när och varför den får det värde som den har. Felhantering 21 March 2002 13 Felhantering 21 March 2002 14 Vid mer avancerade felsökningar använder man olika hjälpmedel. Det enkla JDK innehåller en enkel avlusare jdb som kan användas i enklare fall. För mer avancerat arbete behöver man en riktig utvecklingsmiljö (ex Forte, Visual J++, Visual Cafe el dylikt) public class Hello { public static void main(string [] arg) { System.out.println( Welcome to Java ); >javac -g Hello.java >jdb Hello Initializing jdb... 0xfd2c0ca8:class(Hello) > stop in Hello.main Breakpoint set in Hello.main > run run Hello Breakpoint hit: Hello.main (Hello:3) main[1] running... main[1] next Välkommen till Javamain[1] Breakpoint hit: Hello.main (Hello:2) main[1] next Felhantering 21 March 2002 15 Felhantering 21 March 2002 16

Breakpoint hit: main[1] sun.tools.debug.mainthread.run (MainThread:56) main[1] next main[1] Breakpoint hit: sun.tools.debug.mainthread.run (MainThread:54) main[1] next main[1] Hello exited Hur hantera då Java fel som uppstår under arbetet? Genom att skapa undantag. Vad är en undantag? När ett fel uppstår skapas ett objekt som beskriver felet. Detta objekt är av typ Exception, på svenska undantag. Java avbryter programmet vid den punkt där felet inträffade och signalerar att ett undantag kastats. Det kan sedan finnas en hanterare som fångar undantaget, hanterar det och fortsätter programmet. Om ingen hanterare finns används en standardhanterare som skriver ett felmeddelande och avbryter programmet. Felhantering 21 March 2002 17 Felhantering 21 March 2002 18 Du måste i princip alltid i Java tala om vad som ska hända med eventuella fel som kan inträffa. Du har alltid två alternativ: Ta hand om felet. Skicka det vidare till den som anropade mig. Om du är befinner dig i main så innebär alternativ två att programmet avbryts. Man kan tänka sig kombinationer av ovanstående också. T. ex. att man släpper någon resurs, stänger en fil eller nåt sånt och sedan skickar fel vidare. Det finns undantag från den obligatoriska felhateringen. Javas undantag utgår från basklassen Throwable. Den har sedan två härledda klasser Error och Exception. Undantag av typ Error kommer från Javamaskinen eller från någon annan basdel och kan vara saker som slut på minne och sådant. Kan inte hanteras av dig. Undantag av typ Exception kan ytterligare finindelas med flera härledda klasser. En sådan är RuntimeException. De undantag som hör dit är alla vanliga såsom felaktigt arrayindex, division med noll, kvadratrot ur negativt tal etc. Dessa kan hanteras men måste inte. Felhantering 21 March 2002 19 Felhantering 21 March 2002 20

Övriga typer måste hanteras. Varje metod som skapar ett undantag som den inte själv hanterar måste tala om detta i deklarationen så att omvärlden är beredd. Exempelvis har metoden readline som finns i klassen BufferedReader en deklaration som ser ut som: public String readline() throws IOException {... Vill jag använda denna metod måste jag ange vad jag ska göra med eventuella fel. Jag kan t. ex. nu göra public class Person { private String namn; private BufferedReader b = new BufferedReader( new InputStreamReader(System.in)); public Person() { public läsnamn() { // hantera fel själv try { namn = b.readline(); catch (IOException e){ System.out.println( I/O-fel ); Felhantering 21 March 2002 21 Felhantering 21 March 2002 22 Nyckelordet try används för att skapa ett block av satser som är beredda att hantera alla typer av fel. I slutet av detta block finns en eller fleracatch-block, ett för varje typ av fel. Här har vi bara ett catch, för undagtaget IOException. Det betyder rent generellt att något fel vid ineller utmatninginträffat. Om ett sådant fel inträffar här så skrivs ett felmeddelande ut och programmet fortsätter efter catch-blocket. Om ett fel inträffar tilldelas inget nytt namn. Jag kan alternativt göra public class Person { private String namn; private BufferedReader b = new BufferedReader( new InputStreamReader(System.in)); public Person() { public läsnamn() throws IOException { namn = b.readline(); Nu tar jag inte själv hand om felen utan skickar det vidare. Den som anropar denna metod måste ta hand om felen. Felhantering 21 March 2002 23 Felhantering 21 March 2002 24

Nu kan vi t. ex. göra en metod som läser ett heltal och som inte avbryter bara för att vi skriver saker som inte är giltiga heltal. Antag att vi har samma BufferedReader som tidigare. public int readint() { int tal=0; try { tal = b.readline().parseint(); catch (IOException e) { System.out.println( Ellol ); tal = 0; catch (FormatNumberException e) { System.out.println( Fel ); tal = 0; return tal; En bättre variant är ju att se till att det alltid blir ett giltigt svar. Det gör vi genom att försöka läsa igen. Vi kan ALDRIG återvända till den plats där felet uppstod. Vi fortsätter alltid efter det catch-block som hanterar felet. Det är inget som hindrar att jag lägger en repetition runt alltihopa dock. Exempelvis kan jag göra en oändlig repetition som avbryts om det gått bra. Det kan bli yngefär så här: När det blir fel ges ett meddelande och noll returneras. Felhantering 21 March 2002 25 Felhantering 21 March 2002 26 public int readint() { int tal=0; while (true) { try { tal = b.readline().parseint(); break; // alles gut catch (IOException e) { System.out.println ( Fel, gör ett nytt försök ); catch (FormatNumberException e) { System.out.println ( Fel, gör ett nytt försök ); return tal; Nu läser vi en rad och försöker konvertera den till ett heltal. Om det går bra så lämnar vi repetitionen. Annars blir det en felutskrift och vi försöker igen. Kan jag använda detta själv på nåt vis? Du kan själv kasta undantag när felaktiga saker inträffar. Exempelvis: import extra.*; // en klass om innehåller en del egenskaper hos en person public class Person { protected String namn = "NoName"; protected String adress = ""; protected int födelse_år; protected int inkomst; // konstruktor där alla data anges public Person(String n, String a, int år, int ink) { if (n.equals("nisse")) throw new IllegalArgumentException("Otillåtet namn"); namn = n; adress = a; födelse_år = år; inkomst = ink; // standardperson public Person() { public static void main(string [] args) { Person p2, person; // skapa en personreferens // skapa en ny slumpmässing person person = new Person("Göran Person", "Rosenbad", 1949, 10); p2 = new Person("Nisse", "Rosenbad", 1949, 10); // skrivut data om denne person person.skrivut(); ; Felhantering 21 March 2002 27 Felhantering 21 March 2002 28

java Person.java java Person Exception in thread main java.lang.illegalargumentexception: Otillåtet namn at Person.<init>(Person.java:15) at Person.main(Person.java:127) Nu utlöstes ett undantag i konstruktorn. Eftersom det inte finns någon catch i main så avbryts programmet. Om du vill hantera detta så blir det try och catch vid skapandet av personer. Om du vill ha en finare kontroll över felen kan du skapa dina egna undantag. Du gör dessa genom att bygga ut lämplig basklass. Exempvis så här: public class FelaktigtNamn extends RuntimeException { ; public FelaktigtNamn() { public FelaktigtNamn(String s) { super(s); IllegalArgumentException är av typen RuntimeException som inte kräver hantering. Felhantering 21 March 2002 29 Felhantering 21 March 2002 30 Ger dig en ny felklass som du kan använda, t. ex. så här: import extra.*; // en klass om innehåller en del egenskaper hos en person public class Person { protected String namn = NoName ; protected String adress = ; > javac Person.java > java Person Exception in thread main FelaktigtNamn: Otillåtet namn: Nisse at Person.<init>(Person.java:15) at Person.main(Person.java:127) Hanteras precis som tidigare. protected int födelse_år; protected int inkomst; // konstruktor där alla data anges public Person(String n, String a, int år, int ink) { if (n.equals( Nisse )) throw new FelaktigtNamn( Otillåtet namn: + n); namn = n; adress = a; födelse_år = år; inkomst = ink; Felhantering 21 March 2002 31 Felhantering 21 March 2002 32