Magnus
Lilja
Ulrik
Nilsson & Bo Silborn
![]()
Magnus
Lilja
Ulrik
Nilsson & Bo Silborn


1. Introduktion 6
1.1 Grunder 7
1.2 Introduktion till NetBeans 12
1.3 Skapa ett program 13
1.4 Olika typer av fel 18
1.5 Utmatning 19
Sammanfattning 21
Repetitionsfrågor 22 Uppgifter 23
2. Variabler 24
2.1 Variabelnamn 25
2.2 Deklaration 27
2.3 Tilldelning 27
2.4 Inmatning 30
2.5 Typomvandlingar 32
2.6 Tal 33
2.7 Text 34
2.8 Unicode 36
Sammanfattning 38
Repetitionsfrågor 40 Uppgifter 41
3. Fält och strängar 42
3.1 Talfält 43
3.2 Teckenfält 46
Sammanfattning 47
Repetitionsfrågor 47 Uppgifter 47
4. Operatorer 48
4.1 Aritmetiska operatorer 49
4.2 Tilldelande aritmetiska operatorer 52
4.3 Förändringsoperatorer 54
4.4 Prioritering 56
Sammanfattning 57
Repetitionsfrågor 58 Uppgifter 59
5. Felsökning 60
5.1 Felsökning i NetBeans 61
Sammanfattning 65
6. Aktivitetsdiagram och pseudokod 66
6.1 Algoritmer och pseudokod 67
6.2 Kontrollstrukturer 68
6.3 Aktivitetsdiagram 69
Sammanfattning 73
Repetitionsfrågor 74 Uppgifter 75
7. Villkorssatser 76
7.1 if-else 77
7.2 if 84
7.3 if-else if 86
7.4 switch-case 88
7.5 Att jämföra strängar 91
7.6* Villkorsoperatorn ? : 93
Sammanfattning 96
Repetitionsfrågor 98 Uppgifter 100
8. Repetitionssatser 102
8.1 for 103 8.2 while 111
8.3 do 113
8.4 continue och break 117
Sammanfattning 118
Repetitionsfrågor 119 Uppgifter 120
9. Metoder 122
9.1 Att skriva och anropa en metod 123
9.2 Metoder med flera parametrar 127
9.3 Värdeparametrar 128
9.4 Metoder utan returvärde 130
9.5 Fält och strängar som parametrar 131
9.6 Matematikklassen Math 135
Sammanfattning 138
Repetitionsfrågor 139 Uppgifter 140
10. Grafiska gränssnitt 142
10.1 Fönsterkomponenter 143
10.2 Swing 143
10.3 Händelser 148
10.4 Talinmatningar 151
10.5 Listrutor och grupprutor 152
Sammanfattning 158
Repetitionsfrågor 158 Uppgifter 159
11. Grafik 162
11.1 Ritning av geometriska figurer 163
Sammanfattning 172
Repetitionsfrågor 173
Uppgifter 173
12. Klasser 174
12.1 Objekt 175
12.2 Klasser 177
12.3 Att använda en klass 180
12.4 Medlemsmetoder 181
12.5 Konstruktorer 185
12.6 Sätta och hämta 187
12.7 Mushändelser 190
12.8 Referenser 192
Sammanfattning 195
Repetitionsfrågor 196
Uppgifter 197
13. Sortering och sökning 198
13.1 Sortering 199
13.2 Bubbelsortering 201
13.3 Sökning 203
Sammanfattning 206
Repetitionsfrågor 207
Uppgifter 207
14. Samlingar 208
14.1 ArrayList 209
14.2 Stack 214
14.3 Prioritetskö 218
Sammanfattning 223
Repetitionsfrågor 224
Uppgifter 224
15. Rekursiva metoder 228
15.1 Summor och produkter 229
15.2 Talföljder 233
15.3 Fält 236
15.4 Ett grafiskt exempel 239
Sammanfattning 243
Repetitionsfrågor 244
Uppgifter 245
16. Felhantering 248
16.1 Undantagsfel 249
17. Facit till teorifrågor och övningar 252
Register 307




Something mysterious is formed, born in the silent void. Waiting alone and unmoving, it is at once still and yet in constant motion. It is the source of all programs. I do not know its name, so I will call it the Tao of Programming.
If the Tao is great, then the operating system is great. If the operating system is great, then the compiler is great. If the compiler is great, then the application is great. The user is pleased and there exists harmony in the world.
The Tao of Programming flows far away and returns on the wind of morning.
The Tao of Programming
En dator är en på många sätt fantastisk maskin. Den är olik de flesta andra maskiner som människan använt genom historien. De flesta maskiner har varit konstruerade för att utföra en speciell arbetsuppgift. En del av dem har varit ganska komplicerade och sinnrika, men de har fortfarande bara kunnat användas till en enda sak. Vindmöllorna kunde mala mjöl. Ångmaskinen gav mekanisk kraft och radioapparaterna kunde omvandla radiovågor till ljud.
Hårdvara
En dator däremot är sällan konstruerad för ett speciellt ändamål. Datorer används för att styra andra maskiner, kommunicera, övervaka, underhålla, för att lagra stora mängder information och för många andra ändamål. Men alla dessa datorer, fastän de kommer i olika storlekar och skepnader, är principiellt lika under skalet. De innehåller en eller flera processorer, chip och andra elektroniska komponenter, sådant som vi brukar kalla hårdvara. Men det finns inte många processorer som bara kan visa film, eller bara kan öppna och stänga en dörr. Om man till exempel vill övervaka och styra in- och utpassering genom dörrarna i en byggnad kan man i stora drag köpa vilken dator som helst. Samma dator kan förmodligen dessutom användas till att visa film, skicka e-post och mycket annat.
Mjukvara
För att få en dator att utföra en speciell uppgift krävs ett speciellt program. Program kallas även för mjukvara. Ett program är en mängd instruktioner som talar om vad datorn ska göra. Om en knappsats vid en dörr skickar en sifferkombination till en dator kan processorn till exempel svara med en signal till motorlåset i dörren. Men samma siffror från en film på en sticka innehåller förmodligen färgen på en pixel. För att en pixel på skärmen ska tändas med denna färg behövs istället ett helt annat program, ett program som skickar en signal till grafikkortet istället för till dörren.
Maskinspråk
Det finns bara ett begränsat antal operationer till varje processortyp. Operationerna är väldigt enkla, till exempel ”Flytta tal A till adress 10” där adress 10 kan vara en plats i datorns minne, en pixel på skärmen eller ett motorlås i en dörr, eller någon annan elektronisk krets som är ansluten till datorn. Andra operationer är till exempel ”addera tal A och B” eller ”jämför tal A med B”. Dessa grundläggande operationer kallas för datorns maskinspråk, och består av sifferkombinationer. Genom att kombinera instruktionerna på olika sätt kan man få datorn att utföra en viss uppgift. Att få ett program att visa en enkel figur på skärmen kräver till exempel en hel mängd operationer.
Högnivåspråk
Ett modernt program innehåller hundratusentals eller miljontals maskinspråksinstruktioner. Att skriva ett större program på maskinspråk skulle vara näst intill omöjligt. Därför har man uppfunnit programmeringsspråk vars kommandon liknar vanligt människospråk. De kallas högnivåspråk för att skilja dem från maskinspråk. Man kan till exempel skriva saker som ”A+B” för att addera två tal, eller ”DrawRectangle” för att visa en rektangel på skärmen. Det finns och har funnits ganska många olika högnivåspråk. Ett av de mest använda är Java, som utvecklats från C och C++. Andra kända språk är till exempel C#, Visual Basic och Python.
Högnivåspråk skrivs i vanliga textfiler och kallas för källkod. Källkoden måste översättas till maskinspråk innan den kan användas av en processor. Översättningen kan ske i flera steg och kallas kompilering. Kompilering genererar vanligen filer med filändelsen .exe om programmet ska köras på Windows-datorer, eller .app om programmet ska köras på Macintosh-datorer. Om man vill att programmet ska kunna köras på både Windows och Mac (eller andra operativsystem) är det vanligt att låta varje dator som ska köra programmet själv göra det sista översättningssteget. Det kallas för interpretering eller ”just-in-time” kompilering (JIT). Java är ett interpreterande språk, och när man kompilerar Javakod får man .jar-filer eller .class-filer som kan köras på vilken maskin som helst. Java används i allt från diskmaskiner till bilar, mobiltelefoner och datorer.
Bilden nedan visar hur översättningen fungerar i Java. Bytekod är ett mellansteg mellan källkod och maskinkod.
Programmerarens dator
Källkod Pacman.java
Bytekod
kompilering
Användarens dator
Bytekod Pacman.class Pacman.class
Programmet distribueras via internet eller diskar interpretering
För att köra ett javaprogram måste användaren ha inte bara själva programfilen (bytekoden), utan även ett speciellt program interpreterar bytekoden till maskinkod som passar just hans dator. Javainterpretatorn heter Java Virtual Machine, JVM, och måste installeras på en dator innan man kan köra javaprogram på den. JVM finns för alla stora operativsystem, och det betyder att programmet Pacman i bilden ovan kan användas på i stort sett vilken dator som helst. Innan Java fanns var programmeraren tvungen att skapa en version som bara fungerade på Windows, en annan som bara fungerade på Macar, och så vidare.
Maskinkod
Thus spake the master programmer:
– Without the wind, the grass does not move. Without software, hardware is useless.
The Tao of Programming
Man behöver inte vara någon datortekniker för att kunna programmera, men man måste känna till de tre komponenterna processorn, arbetsminnet och hårddisken.
På hårddisken finns data lagrat i magnetiska spår eller halvledarkretsar. Datan är uppdelad i filer. Hårddisken är till för att spara data när datorn är avstängd, fast den kan också användas som reserv till arbetsminnet.
När en fil öppnas laddas den till arbetsminnet. I arbetsminnet lagras också all data som strömmar in i datorn från dess olika portar, där till exempel tangentbordet och musen är anslutna. Arbetsminnet kallas även RAM-minne, primärminne eller internminne. Det är direktkopplat till processorn.
Processorn läser data från arbetsminnet, genomför operationer och skickar tillbaka svaret till arbetsminnet. Processorn kan liknas vid datorns hjärna. Men den tänker inte, den följer bara programmets instruktioner.
Låt oss studera hur processorn och arbetsminnet arbetar tillsammans med ett exempel. Antag att du öppnar programmet Kalkylatorn (filen calc.exe) för att räkna ut vad 4 + 3 blir.
Programfönster

Arbetsminne
1 Startar programmet Ritar fönstret, reserverar plats i minnet och väntar sedan på input.
2 Klickar på knappen 4Lagrar värdet 4 i arbetsminnet (på reserverad plats A).
3 Klickar på knappen +Lagrar värdet ’+’ i arbetsminnet (på reserverad plats B).
4 Klickar på knappen 3Lagrar värdet 3 i arbetsminnet (på reserverad plats C).
5 Klickar på knappen = Undersöker värdet i B.
Väljer operationen ADD och läser in värdena i A och C.
Skickar tillbaka värdet 7 till arbetsminnet (D).
Ritar om fönstret med värdet i D i textrutan.
Hoppar tillbaka i instruktionskön till den plats där den väntar på input.
Lägg märke till följande:
l Programmet Kalkylatorn innehåller instruktionerna till vad processorn ska göra.
l Programmet är händelsestyrt. Om användaren inte gör något händer inget.
l Programmet är sekventiellt. Alla instruktioner genomförs en i taget i en given ordning.
l Programmet kör olika kod beroende på vilket räknesätt användaren väljer. Det kallas selektion.
l Programmet är repeterbart. Processorn kan hoppa till olika instruktioner, även bakåt, och på så sätt göra om samma sak många gånger.
l Minnet delas in i mindre platser som kallas för variabler, där varje plats ges ett unikt namn och har utrymme för ett värde.
Som programmerare bryr man sig sällan om vad som händer i processorn, men det är bra att ha lite koll på vad som händer i arbetsminnet när man reserverar plats och skickar runt värden mellan platserna. Hur detta går till beskrivs i kapitlet om variabler, men du kommer förmodligen att förstå programmering mycket bättre om du redan nu lär dig att tänka på en variabel som en minnesplats som innehåller ett värde.
Programstruktur
En text är uppbyggd av meningar som delas in i avsnitt med olika rubriker, som i den vänstra spalten nedan. På samma sätt är programkod uppbyggd av satser och programblock, som i den högra spalten. Koden här är inte riktig kod, utan en sorts halvkod som bara visar strukturen. Precis som man avslutar en mening med punkt måste man avsluta en sats med semikolon (;).
Vanlig text
Rubrik 1
Mening 1. Mening 2. Mening 3.
Rubrik 2
Mening 4. Mening 5.
Programkod
Programblock 1
{ Sats 1; Sats 2; Sats 3; }
Programblock 2
{ Sats 4; Sats 5; }
Lägg märke till att programblocket består av en rubrik som kallas för programblockets huvud, följt av en klammerparentes { } som innehåller programblockets satser.
Mellan satserna kan man ha hur många mellanslag, tabbar eller tomma rader man vill. Mellanslag, tabbar och tomma rader gör det lättare att läsa koden, men de kompileras inte till bytekoden. Kompilatorn bestämmer vad som tillhör programblocket bara med hjälp av klammerparenteserna.
Eftersom kod är svårare att läsa än vanlig text brukar man göra blockstrukturen lättare att se genom att bara skriva en sats per rad, och dessutom indentera (skjuta in) satserna med en tab eller några mellanslag. Då kan det se ut som här till höger.
Variant 1 har klammerparentesen på samma rad som blockhuvudet. Variant 2 har klammerparentesen på egen rad. Vilket man föredrar är en smaksak.
Programblock 1 { Sats 1; Sats 2; Sats 3; }
Programblock 2 { Sats 4; Sats 5; }
Variant 1
Variant 2
Fördelen med indentering blir särskilt tydlig när man har programblock inuti varandra:
Programblock 3 { Sats 1; Sats 2;
Programblock 3A { Sats 3; Sats 4; } }
Alla satser i ett programblock utförs i den ordning de står, men programblocken behöver inte köras i ordning. Ett programblock kanske körs när användaren trycker på tangenten A. Ett annat programblock körs när användaren trycker på tangenten B. Då är det användaren som bestämmer vilken ordning blocken körs i. Därför är det väldigt viktigt att använda indentering så att man lätt ser vilka satser som utförs tillsammans.
Det finns olika sorters programblock. Vissa kan man skriva i en egen fil, medan andra vanligen står inuti ett yttre programblock. Nedanstående översikt ger en tjuvtitt på några olika sorters programblock som du kommer att stöta på i boken.
Metod
En metod innehåller oftast bara variabler och satser som manipulerar variablerna.
Klass (class)
En klass innehåller oftast bara variabler och metoder, men kan även innehålla andra klasser, som då kallas nästlade klasser. Varje klass skrivs i en egen fil som har samma namn som klassen följt av .java.
Om den här boken
I bokens text står det ibland om användaren. Med användaren menas den person som ska köra programmet, till skillnad från programmeraren som skapar programmet. Det är du som är programmerare, men du blir förstås användare när du testar dina program.
Boken är upplagd så att teori varvas med exempel, övningar och frågor. Övningar är sådana som du ska programmera i NetBeans. Frågorna behöver du bara fundera över och svara på i boken eller ett anteckningsblock.
I slutet av varje kapitel finns en sammanfatting, repetitionsfrågor och uppgifter. Du gör dem på samma sätt som övningarna inne i kapitlet.
Nedan finns halvkod som innehåller kodblock och satser. Strukturera upp koden med rader och indentering så att man lätt ser var ett block börjar och slutar, och vilka block satserna tillhör.
a) Programblock 1{Sats 1; Programblock 2{Sats 2; Sats 3;}}
b) Programblock 1{Sats 1; Sats 2; Programblock 2{Sats 3; Sats 4; Programblock 3{Sats 5;} Sats 6;}}
Det finns program som används för att skapa andra program. De kallas för Integrated Development Environment, eller kortare för IDE. På svenska kan man säga utvecklingsmiljö. NetBeans är en modern IDE med massor av funktionalitet som underlättar för programmeraren. I ett och samma program skriver man kod, kompilerar, testar och felsöker den.
För att skriva Javaprogram behöver man egentligen bara en uppsättning filer som kallas för Java Development Kit (JDK). De är gratis finns på internet. JDK innehåller bland annat kompilatorn som översätter javakod till bytekod. Den heter javac och är ett konsolbaserat program, vilket innebär att den kan vara lite svår att använda.
I den här boken används NetBeans. Med NetBeans är det lätt att skriva och kompilera program utan att bry sig om de olika delarna av JDK. NetBeans är också gratis och finns på internet. Det är enklast att ladda ner ett paket som kan installera både NetBeans och JDK på samma gång. Ett sådant paket (bundle) finns till exempel på Oracles sajt. Oracle är organisationen bakom Java. Sök på Netbeans JDK Bundle, så bör du hitta en lämplig länk. Filen laddas ner och installeras som vilket program som helst. Det är sannolikt inte avgörande vilken version du använder för att kunna följa innehållet i den här boken.
Ladda ner och installera NetBeans och JDK, så att du kan följa med på din egen dator i följande exempel.
När du först startar NetBeans och har skapat minst ett projekt ser det ut ungefär så här.

Som de flesta program har det en menyrad och ett verktygsfält överst. Den stora ytan i mitten kallas Start Page och visar lite information och snabblänkar till dina senaste projekt (om det finns några).

Den avlånga panelen till vänster har flikarna Projects, Files och Services. Fliken Projects listar alla dina program.
Varje program är ett eget projekt och sparas i en egen mapp. Projektmappen innehåller alla programfiler och mappar som tillhör programmet.

Till höger om flikarna finns en liten ikon som heter Minimize Window Group. Genom att klicka på den kan man få panelen att kollapsa till en flik längs vänsterkanten. Det är bra om man har ont om skärmutrymme och inte behöver se projektfilerna hela tiden.
Underst finns en panel som heter Output. Den ger varierande information beroende på vad du håller på med för tillfället.
Skapa ett projekt
Klicka på menyn File och välj New > Project. Ett fönster dyker upp som på bilden nedan. Markera Java och Java Application enligt pilarna i bilden och klicka på Next> Ange ett namn i textrutan Project Name. Namnet får inte innehålla mellanslag eller konstiga tecken, och ska inte börja med en siffra. Det här exemplet är det första exemplet i kapitel 1 så vi kallar det Exempel01_01. Understykningstecken är tillåtet.

Ska vara ikryssad

Klicka på knappen Finish. Projektet skapas och dess innehåll dyker upp under fliken Projects. Den väsentliga delen av projektet är filen Exempel01_01.java. Den öppnades automatiskt i den stora panelen till höger. Det här är källkodsfilen för programmet Exempel01_01.
NetBeans klistrar automatiskt in en del text som utgör själva programskalet, det vill säga ett fullt fungerande program som inte gör något.
Projektöversikt

Källkod
Klassöversikt
Kommentarer
All text som står mellan /* och */ eller efter dubbla snedstreck // är gråmarkerad och utgör kommentarer. Dessa rader kompileras inte till bytekod och finns bara med för att förtydliga och dokumentera koden. Tydliga kommentarer gör programmet lättare att förstå för andra programmerare, och även för den som skrev programmet, särskilt om det gått ett tag sedan han eller hon arbetade på det.
Nyckelord
NetBeans formaterar kod i olika färger för att öka läsbarheten ytterligare. Blåmarkerade ord är fördefinierade nyckelord i Javaspråket. Man skulle kunna säga att de är javaspråkets glosor.
Paket
På rad 6 ovan finns följande sats:
package exempel01_01;

Det talar om att koden skall tillhöra ett paket som heter exempel01_01. I fliken Projects kan man se att filen Exempel01_01.java verkar ligga under en paketliknande ikon. Det har att göra med satsen på rad 6.
Paket är ett sätt att dela upp stora program i mindre delar. Det får inte finnas två olika saker som heter likadant i samma paket. Ibland behöver man använda samma namn på olika saker. Då används flera paket.
Javakod delas även upp i klasser för att bli enklare att överblicka och felsöka. Även om programmet är litet måste det alltid finnas minst en klass. En klass är ett kodblock som börjar med nyckelordet class. I exemplet börjar klassen på rad 12:
public class Exempel01_01 {
public class betyder att det efterföljande kodblocket är en offentlig klass. I vårt exempel heter klassen Exempel01_01, eftersom den första klassen i ett projekt automatiskt får samma namn som projektet. Lägg märke till att namnet börjar med stor bokstav. Java skiljer på små och stora bokstäver, så exempel01_01 (som är ett paket) är inte samma sak som Exempel01_01 (som är en klass).
Klassen har samma namn som filen, bortsett från att filen har ändelsen .java.
Klassen måste vara offentlig (public) för att operativsystemet ska kunna starta programmet. I större program kan det finnas privata klasser som är gömda i programmet och bara används internt.
Klicka på klammerparentesen { på rad 12. Den färgmarkeras tillsammans med en avslutande klammerparentes } längst ner i koden, så att du lätt ser vad klassen innehåller.
Metoder
Inuti klassen finns ett kodblock på rad 16 som är en metod med namnet main:
public static void main(String[] args) { // TODO code application logic here }
Det är egentligen här programmet börjar. Paket och klasser har att göra med kodens organisation och programmets minneshantering. Metoder innehåller kod som “gör” något. Alla program har en metod som heter main som anropas av operativsystemet när programmet startas. Main-metoden (huvudmetoden) är programmets ingångspunkt. När det här programmet körs, startar det på rad 17, inte på rad 1.
static gör att den här metoden blir körbar direkt när programmet startas. void betyder tomhet på engelska och anger att den här metoden inte returnerar något värde som finns kvar när metoden kört klart.
Metodnamn följs alltid av en parentes som definierar indata till metoden. Exemplet använder inte indata, så vad String[] args betyder får du veta senare.
I panelen under Projects i finns en panel som heter Navigator. Här kan du se en överblick över dina klasser och metoder.
För att få programmet att göra något fyller man på main-metoden med kod. Fyll på main-metoden med en sats, så att hela programmet ser ut så här (förutom kommentarerna, som tagits bort av utrymmesskäl.)
package exempel01_01;
public class Exempel01_01 {
public static void main(String[] args) {
System.out.println("Hej världen."); } }
Satsen System.out.println(”Hej världen”); skickar texten Hej världen till systemets standardutenhet (datorskärmen på en vanlig dator). Detta kallas för en utmatning.
Provkör programmet med F6-tangenten eller välj menyalternativet Run > Run Main Project. Resultatet ser du i panelen Output under källkoden. Output är ett konsolfönster som är inbyggt i NetBeans.
Exempel01_01 är ett konsolprogram. Det är helt textbaserat och saknar grafik. I de första kapitlen i den här boken får du öva på grunderna i Java med hjälp av konsolprogram, för de är enklare att skapa än fönsterprogram med knappar och bilder. Men i andra halvan av boken får du även lära dig att skapa snygga grafiska program.
Det är endast i undantagsfall som ett lite större program fungerar första gången det körs. Du kommer att upptäcka att du får ägna en hel del tid åt att leta efter fel i dina program. När man rättar till felaktigheter i ett program säger man att man felsöker det (debug på engelska). Det kan förekomma tre olika typer av fel i ett program:
l kompileringsfel
l exekveringsfel
l logiska fel
Kompileringsfel är fel som beror på att man inte har följt de språkregler som gäller i Java. Exempel på sådana fel är stavfel, inklusive stora och små bokstäver (t ex system istället för System) och glömda semikolon eller parenteser. De kallas kompileringsfel då de upptäcks vid kompileringen och denna typ av fel är relativt enkla att korrigera då kompilatorn genererar felmeddelande. Tyvärr är felmeddelandena inte alltid helt enkla att tolka och ett annat problem är att ett fel på en rad kan få kompilatorn att upptäcka ”felaktigheter” i efterliggande satser trots att de är korrekta. Börja därför med att rätta ett eller ett par fel du enkelt kan hitta och kompilera sedan om programmet. En korrigerad felaktighet kan nämligen minska antalet felmeddelanden ordentligt.
Som programmerare kommer du att få många kompileringsfel och det är bra att bli bekant med felmeddelandena tidigt. Lägg därför in några fel i Exempel 1.1 och se om du kan tolka felmeddelandena. Pröva t.ex. först med att utelämna semikolonet efter utmatningen och därefter med att utelämna vänsterparentesen i metodhuvudet (skriv main String[] args) { ).
Kompileringsfel markeras med en röd ikon i vänstermarginalen, samt genom att satsen med felet stryks under med en vågig röd linje. Håll muspekaren över den röda ikonen för att se felmeddelandet.
Felmeddelandet nedan talar om att ett semikolon saknas.

Exekveringsfel är fel som gör att programmet kraschar och ett vanligt fel är division med noll. Jämför med en beräkning med miniräknare, du kan slå in 5/0, men beräkningen avbryts och du får ett felmeddelande. Dessa fel upptäcks alltså vid programkörningen och ett bra sätt att finna dem visas senare i boken.
Logiska fel gör att programmet kan köras men inte ger det förväntade resultatet. Om du vill beräkna summan av två tal men av misstag skriver tal1 - tal2 så har du ett logiskt fel. De felsöks på samma sätt som exekveringsfel.
Det första programmet gav en utskrift på en rad. Vi ska nu skriva ett program som ger utskrift på flera rader.
public static void main(String[] args) { System.out.print("Skriv ut en text med print, "); System.out.print("fortsätt på samma rad med print "); System.out.println(); System.out.println("Skriv en text och radbryt med println, "); System.out.println("Så kommer nästa utskrift på ny rad."); }
Skriv ut en text med print, fortsätt på samma rad med print. Skriv en text och radbryt med println, så kommer nästa utskrift på ny rad.
För att åstadkomma en ny rad vid utskrift måste man använda println (printline). println är en metod, och texten som ska skrivas ut anges som indata i parentesen. Man kan lämna parentesen tom, och då skrivs bara en radbrytning ut.
Skriv ett program som ger utskriften:
Programmeringspråk
¡När du lägger till fler projekt (program) i NetBeans är det bara ett av dem som kan vara aktivt åt gången. Det är bara det aktiva projektet som går att köra. Det aktiva projektet anges med fetstil i panelen Projects. Om du vill gå tillbaka till Exempel01_01 och köra det måste du högerklicka på projektet och välja Set as Main Project. Annars startar något annat program.
Ett program med reserverade tecken
I Java är citationstecknet reserverat för att ange var en textsträng börjar och slutar, som exempel 1.1 och 1.2 visade. Om du vill att ett citationstecken ska skrivas ut på skärmen måste det föregås av ett bakåtvänt snedstreck, \. Det bakåtvända snedstrecket inleder en flyktsekvens och ändrar betydelsen av det efterföljande tecknet.
System.out.print( "Ett citationstecken: \"." );
Koden ger utskriften
Ett citationstecken: ”.
På motsvarande sätt måste ett bakåtvänt snedstreck föregås av ett annat bakåtvänt snedstreck för att kunna skrivas ut på skärmen.
Exempel 1.3
public static void main(String[] args) { System.out.print( "Ett \\-tecken i en sträng föregås av ett " ); System.out.println( "\\ i koden." ); System.out.println( "Textsträngar omges av \"-tecknet." ); }
Ett \-tecken i en sträng föregås av ett \ i koden. Textsträngar omges av ”-tecknet.
Som körexemplet visar ger teckensekvenserna \\ och \” utskrifterna \ och ”. Eftersom hela texten i första meningen inte fick plats i samma programrad i boken delade vi upp texten i två strängar. I NetBeans kunde hela meningen skrivas ut i samma println.
Skriv ett program som ger utskriften inklusive citationstecknen
”To be or not to be, that is the question”
Ett program skapas som källkod. Källkoden kompileras till bytekod, som går att köra på vilken dator som helst, om datorn har Java Virtual Machine (JVM) installerad. JVM interpreterar i sin tur bytekoden till maskinkod som kan exekveras av just den datorn.
Programkod består av programblock och satser, på motsvarande sätt som en bok består av rubriker och meningar. Satserna exekveras sekventiellt, alltså i ordning från vänster till höger och uppifrån och ned, precis som man läser. Exekveringen kan dock även hoppa mellan olika satser. Genom selektion kan vissa satser hoppas över. Med hjälp av repetition kan programmet hoppa bakåt och göra om ett antal satser.
När ett program utvecklas kallas det ofta för ett projekt. Projektet kan innehålla flera filer med källkod och andra resurser som behövs. I enkla konsolbaserade program, som exemplen i det här kapitlet, finns bara en fil med källkod.
Kommentarer är text i källkoden som inte ska kompileras till bytekod, men som gör källkoden lättare att förstå för programmeraren. Nyckelord är reserverade ord i Java och har en speciell betydelse. De får bara användas med den betydelsen, och färgmarkeras i de flesta program som är till för att skriva kod. I NetBeans färgas de blå.
Klasser och metoder är olika sorters programblock som är till för att organisera koden på ett logiskt och överblickbart sätt. Fördelen med dessa programblock blir inte tydlig förrän vi börjar skriva lite större program senare i boken, men alla program, oavsett storlek, måste ha minst en klass och en metod som heter main.
public static void main(String[] args) { satser; }
Programmets main-metod är programmets ingångspunkt.
System.out.print( "Textsträng" ); Visar Textsträng i konsolfönstret.
System.out.println( "Textsträng" ); Radbryter konsolfönstret efter utskriften, ungefär som när man trycker enter i Word för att komma till en ny rad.
\" och \\
\ ändrar betydelsen av ” i en text från slut på texten till visa ”
\ ändrar betydelsen av \ från inled flyktsekvens till visa \ 21
rf 1.1. Vad menas med kompilering?
rf 1.2. Vad menas med interpretering?
rf 1.3. Vad innebär det att ett program är händelsestyrt?
rf 1.4. Vad är en variabel?
rf 1.5. Vad har mellanslag, tabbar och radbrytningar för betydelse i programkod?
rf 1.6. Vilka fel finns i programmet nedan?
public class Bugg { public static void Main ( String[] args ) { System.out.print( 'Det finns tre fel' ) } }
rf 1.7. Vilka tre olika typer av fel kan uppstå då man konstruerar ett program?
rf 1.8. Hur ser utskriften från nedanstående kod ut?
System.out.print( "koda " ); System.out.println( "kompilera" ); System.out.print( "och exekvera" );
1.1 Skriv ett program som skriver ut ditt namn och din adress på tre rader på skärmen.
1.2 Förändra programmet från uppgift 1.1 så att en blankrad skiljer namn och adress.
1.3 Skriv ett program som ger utskriften
JJJJJ JJJ J J JJJ
J J J J J J J
J J J J J J J
J J JJJJJ J J JJJJJ
JJJ J J J J J
1.4 Skriv ett program som ger utskriften " " " \ \ / / O O U ___


Ordet variabel har latinskt ursprung och kommer från variare som betyder skifta. I det svenska språket har ordet bl.a. fått betydelsen föränderlig storhet. I programmering är en variabel en lagringsplats för data. Namnet kommer från att dessa data kan förändras under programkörningen. Vi ska i detta kapitel visa hur variabler används samt metoder för inmatning av data från tangentbordet.
¡En variabel är en reserverad plats i datorns arbetsminne som innehåller ett värde. Det kallas variabel eftersom värdet kan ändras.
Variabelnamn
Varje variabel måste ha ett namn som är unikt i sitt programblock. Namnet väljer du själv. Det kan innehålla bokstäver, siffror och understrykningstecken, men inga mellanslag. Det första tecknet får inte vara en siffra. Det spelar ingen roll för Java om namnet börjar på stor eller lite bokstav, men det finns ofta en konvention som bestämmer vilket, beroende på sammanhanget. Om namnet är sammansatt av flera ord blir de lättare att läsa om man skriver de efterföljande orden med stor begynnelsebokstav. Listan nedan visar exempel på tillåtna och otillåtna variabelnamn:
tal3 OK tal 3
text_5 OK 3tal
FEL (innehåller mellanslag)
FEL (börjar med siffra)
antalPengar OK AntalPengar OK _pris OK
Java skiljer på små och stora bokstäver. Därför är det helt OK att använda de två namnen antalPengar och antalpengar i samma programblock. Det är bra om namnen är självbeskrivande. Undvik svårtolkade förkortningar. teleNr är bra, men tn är dåligt.
Datatyper
Olika värden kräver olika mycket plats. Jämför till exempel 35 med 65 535. Det andra värdet tar större plats, i datorns minne såväl som på pappret. Man mäter datorns minneskapacitet i byte. Ju större tal, ju fler byte behövs för att lagra det.
Datorn skiljer också på olika sorters värden. Jämför till exempel 3 med 3,14 och ”pi”. Det första värdet är ett heltal, det andra ett decimaltal och det tredje en text.
Man säger att variablerna har olika datatyper. Listan nedan visar de vanligaste datatyperna:
DatatypVärdegränser (ungefärliga) Utrymme
short Heltal –32 768 till 32 767
2 byte
int Heltal ± 2 ∙ 10⁹ 4 byte
long Heltal ± 9 ∙ 10¹⁸ 8 byte
float
double
Decimaltal ± 3,4 ∙ 10³⁸ (med 7 gällande siffror) 4 byte
Decimaltal ± 1,7 ∙ 10³⁰⁸ (med 15 gällande siffror) 8 byte
char Ett tecken
booleantrue eller false
String En text (en sträng av tecken)
2 byte
1 byte
2 byte/tecken
Datatypen talar om hur en variabel är formaterad. De mest använda är följande fem:
int
int är en förkortning för integer som betyder heltal. Den kan högst ges värdet 2 147 483 647. Om du försöker öka detta värde med 1 slår den över till det minsta värdet –2 147 483 648.
Även om man bara sparar värdet 1 i en int så fylls resten av minnesplatsen på med nollor, den använder ändå 4 byte.
double
En double heter double eftersom den har ungefär dubbelt så stor precision som en float (15 gällande siffror mot 7). Decimaltal kallas för flyttal (float), eftersom decimalpunkten kan befinna sig var som helst mellan de gällande siffrorna. Den är så att säga flytande.
När man skriver ett tal som ska vara en double måste man ta med decimalpunkten, även om alla decimaler är noll (t.ex. 8.0) eller så skriver man talet med ett d efter (8d eller 8D). På motsvarande sätt kan man skriva 8f eller 8F för att få en float. Om man bara skriver 8 räknas det som en int. Tänk på att decimalkommat skrivs med en punkt i javakod.
char
char är en förkortning för character som betyder tecken. En char kan innehålla ett enda tecken, till exempel ’a’, ’?’ eller ’5’. Lägg märke till att datorn skiljer på tecknet ’5’ och heltalet 5.
När man skriver ’5’ (med enkla citationstecken runt) menar man tecknet fem.
En char är egentligen också ett heltal, men talet tolkas som ett tecken enligt en teckentabell som heter Unicode. Mer om detta i avsnitt 2.8.
boolean
Datatypen boolean är döpt efter George Boole, som studerade logik. Det är en datatyp som bara kan innehålla ett av värdena true (sant) eller false (falskt). En jämförelse som t.ex. 3≤ 4 genererar värdet true.
String
En sträng (string på engelska) är ett eller flera tecken som bildar en text (en teckensträng). En sträng skiljer sig från de elementära datatyperna ovan genom att den egentligen består av flera värden. En sträng är sammansatt av flera char-variabler, en för varje tecken. Sammansatta datatyper skrivs med stor begynnelsebokstav och färgmarkeras inte.
När man anger en strängs värde måste man skriva dubbla citationstecken runt texten, så här:
"Det var en gång"
Lägg märke till att tecknet ’a’ och strängen ”a” inte är samma sak ur datorns synvinkel.
Att reservera plats i minnet för ett värde kallas för att deklarera en variabel. Deklarationen måste innehålla en datatyp och ett namn. Datatypen formaterar variabeln för en viss sorts värden. I rutan ges exempel på deklarationer av de fyra variablerna antal, märke, pris och tillSalu.
int antal; g Reservera 4 byte för ett nytt heltal och kalla det antal.
char märke; g Reservera 2 byte för ett nytt tecken och kalla det märke.
double pris; g Reservera 8 byte för ett nytt decimaltal och kalla det pris.
boolean tillSalu; g Reservera 1 byte för en ny boolean och kalla det tillSalu.
Om man behöver flera variabler av samma datatyp kan man deklarera dem i samma sats:
int antalHjul, antalDörrar, antalVäxlar;
Värden som inte ska ändras kan skrivas som de är, till exempel 3.14159265 för π.
Ibland är det dock praktiskt att ge konstanta värden namn på samma sätt som variabler. Då skriver man en deklaration med final framför:
final double PI = 3.14159265; g PI initialiseras och kan sedan inte ändras.
Konstanter skrivs av konvention med stora bokstäver.
Tilldelning är en minnesoperation som sparar ett värde till en variabel. Om variabeln redan innehåller ett värde skrivs det över.
antal = 7; g Man tilldelar värden med =.
g g Tilldelningen sker alltid åt vänster
int antal = 7; g Man kan också deklarera och tilldela i samma sats. Det kallas för att initera variabeln.
String märke = "Volvo";
double pris = 350900.0;
boolean tillSalu = true;
Undvik att göra följande fel:
int antal = 7.0; g Heltal kan inte innehålla decimaler, ens om de är noll.
Stringmärke = Volvo; g Citationstecken behövs: ”Volvo”
int antal = 5; g antal är redan deklarerat. Man kan inte skapa en ny variabel med samma namn. Ta bort int eller välj ett annat namn.
7 = antal; g Tilldelning sker åt vänster, men 7 är en konstant, värdet kan inte ändras.
Följande program initierar en variabel, skriver ut den, ökar den med 10 och skriver sedan ut den igen.
package exempel02_01;
public class Exempel02_01 { public static void main ( String[] args ) { int mittHelTal = 8; System.out.println( "Mitt heltal är " + mittHelTal ); mittHelTal = mittHelTal + 10; System.out.println( "Mitt heltal + 10 är " + mittHelTal ); } }
Programkörningen ser ut så här:
Mitt heltal är 8
Mitt heltal + 10 är 18
Den näst sista raden räknar ut summan av mittHelTal och 10, och tilldelar det nya värdet till mittHelTal, så att det gamla värdet 8 skrivs över med det 18.
Den första utskriftsatsen omvandlar heltalet 8 till strängen ”8” och sätter ihop en ny text med plustecknet, som sedan skrivs till skärmen. Den andra utskriftsatsen gör samma sak, fast nu är variabelns värde 18.
Skriv ett program som skapar de tre decimaltalen talA, talB och summa, och som räknar ut summan. När du kör programmet ska det se ut så här:
Tal A är 2.1
Tal B är 3.1
Summan är 5.2
Följande uppgifter är instuderingsuppgifter. Du behöver inte programmera dem i NetBeans.
Övningsfrågor
öf 2.1 Följande kod innehåller tre deklarationer. Hur många byte använder variablerna tillsammans?
a) double längd = 0.3; double bredd = 50.0; int antal = 12;
b) float fakturaAvgift = 110f; int beställningsNr = 578955; short antalVaror = 3;
c) int pinKod = 1709; char initial = 'G'; char bokstav = initial;
öf 2.2 Det finns ett fel i varje deluppgift. Kan du finna dem och tala om hur man skulle kunna skriva för att det ska bli rätt?
a) int år = 1066; int månad = "juni"; int dag = 19;
b) String distrikt = "Bordeaux"; short liter = 400; float alkoholprocent = 17.0;
c) char körkort = B; double längd = 100; boolean glasögon = false;
Ett program som hela tiden räknar ut samma saker är det ju egentligen ingen vits med. För att användaren ska kunna påverka vad programmet gör måste hon kunna mata in värden till programmets variabler. För att kunna hämta värden från tangentbordet behövs ett objekt av typen Scanner. Scanner innehåller färdiga metoder som pausar ett program och väntar på inmatning från tangentbordet. Användaren skriver något värde och trycker på Enter.
De färdigskrivna metoderna i Scanner finns i ett bibliotek av kod som följer med JDK. För att använda kod från biblioteket måste man importera den till sitt program.
I exemplet nedan får användaren skriva in sitt namn, ålder och längd. Programmet svarar med att fråga om uppgifterna stämmer. Lägg märke till den andra raden som börjar med import. Utan den får du ett felmeddelande på ordet Scanner.
Exempel
package exempel02_02 import java.util.Scanner; // <- VIKTIG
public class Exempel02_02
{ public static void main( String[] args ) {
Scanner input = new Scanner( System.in );
System.out.print( "Skriv namn: " ); String namn = input.nextLine();
System.out.print( "Skriv ålder: " ); int ålder = input.nextInt();
System.out.print( "Skriv längd: " ); double längd = input.nextDouble();
System.out.println( namn+" är "+ålder+" år gammal och " +längd+" m lång." );
System.out.println( "Stämmer det?" ); } }
När du kör programmet kan det se ut så här:
Skriv namn: Gammelsmurfen
Skriv ålder: 100
Skriv längd: 0,3
Gammelsmurfen är 100 år gammal och 0.3 m lång. Stämmer det?
Rad för rad betyder satserna följande:
Scanner input = new Scanner( System.in );
Här skapas ett nytt Scanner-objekt som heter input. Objektet behöver veta att det ska läsa från tangentbordet, som är systemets standardinenhet och kallas System.in. Data kan även läsas från filer på hårddisken eller servrar på internet.
System.out.print( "Skriv namn: " ); String namn = input.nextLine();
Den andra raden ovan är en inmatning. Strängen namn deklareras och tilldelas en text som hämtas från tangentbordet av input.nextLine(). Alla inmatningar bör dock föregås av en ledtext som talar om för användaren vad han förväntas mata in.
Sedan följer ytterligare två inmatningar. Den enda skillnaden är att ett heltal hämtas med nextInt() och ett flyttal med nextDouble().
Sist skriver programmet ut en text med alla värden och frågar om det stämmer. Programmet skulle kunna fortsätta att bearbeta de inmatade värdena, men eftersom det är ett skolexempel som handlar om inmatning avslutas programmet.
Programmet är också ett bra exempel på lämpliga val av datatyper beroende på vad de ska lagra. Ett namn är alltid text och kan bara lagras i String. En ålder skulle kunna lagras i en double, men åldrar anges inte med decimaler så ett heltal är lämpligare. Längd däremot måste kunna anges i decimalform, särskilt om det är längden hos en människa och ska anges i meter.
öf 2.3 G e förslag på lämpliga datatyper för följande värden. Det finns egentligen inget absolut rätt svar, men vissa datatyper är mer uppenbara än andra.
a) En babys födelsevikt
b) Antal månader per år.
c) Initialen i ett namn.
d) En bils hastighet.
e) En bils märke.
f) En bils registreringsnummer.
g) Ett personnummer.
h) Ett telefonnummer.
i) En månadslön.
j) Antalet barn i en klass.
Skriv ett program där man kan mata in ett tal och som räknar ut och visar kvadraten på talet, alltså talet upphöjt till två.
Ibland behöver man omvandla ett värde från en datatyp till en annan. Det kallas för en typomvandling och kan innebära att information förloras. Att omvandla en int (4 byte) till en short (2 byte) betyder att information försvinner om värdet är större än vad som får plats i 2 byte. Att omvandla ett decimaltal till ett heltal kan också innebära att siffror försvinner.
int antal = (int)5.9; g Man kan omvandla 5.9 till ett heltal genom att skriva int i en parentes framför talet. Variabeln antal får här värdet 5. Lägg märke till att det inte är en avrundning. Decimalerna försvinner bara.
double pris = 5; g 5 är ett heltal, men så länge omvandlingen inte riskerar att tappa information är det bara att skriva en vanlig tilldelning. pris blir 5.0.
Omvandling till eller från strängar är lite speciellt. Det ser ut så här:
// Tal till strängar: double sträcka = 5.9; String miltal = Double.toString(sträcka); String årtal = Integer.toString(1789); g miltal får värdet ”5.9” g årtal får värdet ”1789”
// Strängar till tal: int heltal = Integer.valueOf( årtal ); double decimaltal = Double.valueOf("5.9");
// Det här går inte: int feltal = Integer.valueOf("Micke");
g heltal får värdet 1789 g decimaltal får värdet 5.9.
Programmet genererar ett körningsfel. g Det går inte att omvandla "Micke" till ett heltal.
öf 2.4 Här sker tre typomvandlingar. Vilket värde får variabeln i andra raden?
a) double vikt = 4.5; int helaKilon = (int)vikt;
b) int max = 50; short min = (short)max;
c) double sekunder = 1.5; String somText = Double.toString(sekunder);
Skriv ett program där man kan mata in sin ålder och som räknar ut hur många år det är kvar tills man nollar nästa gång och vad man fyller då. (Ledning: Man nollar vart tionde år, så om du delar åldern med 10, tar bort decimalerna och multiplicerar med 10 får du hur gammal personen var förra gången hon nollade.)
Ange din ålder: 23 Du fyller 30 om 7 år!
Man kan skriva uttryck med variabler och tal precis som på en miniräknare. Man använder * som gångertecken. Prioriteringsordningen i uträkningen är som vanligt parenteser först, sedan * och /, sist + och –.
double annasÅlder = 8; g annasÅlder får värdet 8
double evasÅlder = annasÅlder + 2; g evasÅlder får värdet 10
double medelvärde = (annasÅlder + evasÅlder) / 2; g medelvärde får värdet 9
¡Det finns en skillnad mellan hur datorn behandlar heltal och flyttal:
Om man utför en beräkning med endast heltal blir resultatet ett heltal. Om minst ett av talen är ett flyttal blir resultatet ett flyttal.
double kvot; kvot = 5 / 2; kvot = 5 / 2.0; g kvot får värdet 2.0 g kvot får värdet 2.5
!Man får vara uppmärksam på detta när man beräknar t.ex. medelvärdet av heltal.
int ålderTina = 1; // Tinas ålder. int ålderMats = 2; // Mats ålder. int antal = 2; // Antal barn.
double medel; // Barnens medelålder. medel = (ålderTina + ålderMats) / antal; medel = (ålderTina + ålderMats) / (double)antal; g medel blir 1.0 (fel) g medel blir 1.5 (rätt)
I den sista raden sker en typomvandling av variabeln antal så att det blir en double. Då sker beräkningen med decimaler och svaret blir rätt.
Övning 2.4
Skriv ett program där man kan mata in tre heltal till variabler av typen int och beräkna summan och medelvärdet av talen. Kör programmet några gånger med olika tal och kontrollera att det blir rätt.
Operationen + kan användas på två strängar för att sätta ihop dem:
String förnamn = "Kalle";
String efternamn = "Anka";
String namn = förnamn + efternamn;
g förnamn får värdet ”Kalle” g efternamn får värdet ”Anka” g namn får värdet ”KalleAnka”.
Ofta när man sätter ihop strängar vill man ha mellanslag mellan dem:
String namn = förnamn + " " + efternamn; g namn får värdet ”Kalle Anka”
Man kan räkna med tal i ett uttryck som innehåller text om man sätter parenteser runt beräkningen. Parenteser utvärderas alltid först, precis som i matematik:
int talA = 5; int talB = 2;
String info = "Summa = " + talA + talB; String summa = "Summa = " + (talA + talB);
g info får värdet ”Summa = 52”. g summa får värdet ”Summa = 7”.
Plustecknet kan alltså betyda antingen addera eller sätt ihop, beroende på sammanhanget.
Ibland vill man veta vilka bokstäver som ingår i en text. Därför är alla tecken i en sträng numrerade från 0 och uppåt. Numren kallas för index.
sträng H a r a l d
index 0 1 2 3 4 5
I den här strängen säger man till exempel att tecknet ’r’ har index 2.
Man kan kopiera enskilda tecken från en sträng genom att anropa metoden charAt med ett index i parentesen:
char tecken; //För att spara en bokstav.
String namn = "Harald"; tecken = namn.charAt(2); tecken = namn.charAt(0); tecken = namn.charAt(5);
g tecken får värde ’r’.
g Vilket värde får tecken nu?
g Vilket värde får tecken nu?
Andra användbara operationer som kan utföras på strängar är indexOf, length och substring:
String namn = "Maja Gräddnos"; // 12 bokstäver och // 1 mellanslag.
int längd = namn.length(); int mellanslag = namn.indexOf(' '); String efternamn = namn.substring(mellanslag+1,längd);
g längd får värdet 13. g mellanslag får värdet 4. g efternamn får värdet ”Gräddnos”.
length ger antalet tecken i strängen. Eftersom index räknas från 0 är sista bokstavens index alltid längden – 1.
indexOf ger indexet för ett visst tecken, till exempel ett mellanslag (det första mellanslaget om det finns flera).
substring ger en delsträng som innehåller alla tecken från ett startindex till men inte inklusive ett slutindex.
Skriv ett program där användaren kan mata in ett namn och som visar vilka initialer namnet har. Den första initialen är alltid första bokstaven i namnet. Den andra initialen finns alltid på ett index högre än mellanslaget mellan för- och efternamnet.
Ange namn: Maja Gräddnos
Maja Gräddnos har initialerna M.G.
Skriv ett program där användaren kan mata in ett namn och som visar namnet uppdelat på för- och efternamn.
Ange namn: Maja Gräddnos
Förnamn: Maja
Efternamn: Gräddnos
Datatypen char har en speciell funktion. Om man deklarerar en char och initialiserar den till ’A’, så får den egentligen värdet 65. Det beror på att datorns minne bara kan innehålla tal (strängt taget bara ettor och nollor, men vi anger talen i decimalsystemet).
char alpha = 'A'; g alpha får värdet 65.
char alpha = 65; g man skulle lika gärna kunna skriva så här.
Men när datorn ritar det här värdet till skärmen, så ritar den symbolen A och inte 65, för det är vad char betyder: formatera värdet som ett tecken
Datorn använder en teckentabell för att veta vilket tecken som hör till varje tal. Tabellen heter Unicode, och där listas alla bokstäver i alla skriftspråk i hela världen, samt en hel mängd andra tecken och symboler. Den fornnordiska runraden finns till exempel med. Varje tecken i tabellen har ett eget tal.
I tabellen nedan kan du se ett litet utdrag ur Unicode-tabellen som omfattar det latinska alfabetet och några av de vanligaste tecknen i vår del av världen.
Vissa tecken har ingen symbol, som till exempel mellanslag, tabbar och radbrytningar. Det finns dessutom tecken som inte är utskrivbara över huvud taget, fast de är inte med i det här utdraget. Hur tecknen ser ut på skärmen beror också på vilket typsnitt man visar dem i. En mer fullständig tabell finner du enkelt genom att söka på unicode character table på nätet.
Antag att man har sparat ett tecken i en variabel av typen char, och man vill visa det på skärmen, men istället för själva tecknet vill man visa teckenkoden. Då måste man kopiera värdet till en annan variabel som representerar ett heltal, till exempel int, och för att göra det måste man göra en typomvandling.
char alpha = 'A'; int kod = (int)alpha;
System.out.print(alpha+" har koden "+kod);
g alpha får värdet ’A’ (egentligen 65)
g kod får värdet 65 (med hjälp av en typomvandling)
g ”A har koden 65”.
Teckentabell
Blanka
9Tab
10Ny
Skriv ett program där användaren kan välja ett tecken och som talar om vilken teckenkod det har.
Tecken: @
Tecknet @ har teckenkoden 64
En ganska vanlig uppgift är att omvandla stora bokstäver till små eller tvärtom. Det är ganska enkelt för bokstäverna A till Z, eftersom de ligger i en följd i Unicode-tabellen. ’A’ motsvarar 65 och ’a’ motsvarar 97. Skillnaden är 32. Det betyder att man enkelt omvandlar alla stora bokstäver till små genom att omvandla tecknet till en teckenkod, addera 32 och sedan omvandla talet tillbaka till ett tecken.
Skriv ett program där man kan skriva en bokstav A–Z, och som svarar med att visa motsvarande lilla bokstav.
Ange stor bokstav: M
Litet M blir m
En variabel är ett värde som sparas på en egen plats i datorns minne. Värdet kan ha olika betydelser beroende på vilken datatyp det har. För att lagra ett värde måste man först deklarera en variabel. Det är också bäst att initialisera den, det vill säga ge den ett startvärde.
double minaPengar = 1000.0;
Satsen ovan består av fyra delar:
l double är datatypen och reserverar 8 byte i datorns minne och formaterar dem som ett flyttal (ett tal som kan ha decimaler).
l minaPengar talar om vad variabeln ska heta. Det är ungefär som att kalla ett tal för x i matematiken. Det finns regler för vilka tecken man får använda i namnet, men alla bokstäver och siffror är tillåtna, så länge man inte börjar med en siffra.
l = tilldelar (sparar) ett värde till variabeln. Tilldelning sker alltid åt vänster.
l 1000.0 är värdet som ska sparas.
DatatypBetydelseExempel
int (heltal) 45, 1024, -31
double (tal med decimaler) 21.0 (eller 21d eller 21D), 3.14, -1.607
char (tecken) 'A', '@', '3'
boolean (sanningsvärde) true, false
String (text) "Kalle Anka", "Det var en gång.", "1789"
Man kan omvandla ett värde från en datatyp till en annan genom att skriva den nya datatypen i parentes framför variabeln. När man omvandlar till text måste man använda kommandot toString(). När man omvandlar från en text måste man använda kommandot valueOf():
Om pris är en double med värdet 5.90 så är:
Om år är en string med värdet ”1999” så är:
(int)pris ett heltal med värdet 5.
Double.toString(pris) en text med värdet ”5.90”.
Integer.ToString((int) pris) en text med värdet ”5”.
Integer.valueOf( år ) ett heltal med värdet 1999.
Räkning med flyttal fungerar som på en miniräknare. Man använder * som gånger tecken:
double lån = 500; // Belopp i kronor double ränta = 5; // Ränta i procent double skuld = lån + (ränta/100) * lån; // Parenteser först, sedan * och / // + och – görs sist.
Räkning med heltal fungerar likadant, förutom division med bara heltal. Heltalsdivision ger inga decimaler:
int kvot = 7/2; // kvot får värdet 3.
+ kan användas på strängar och betyder då sätt ihop:
String tal1 = "10";
String tal2 = "5";
String tal3 = tal1 + tal2; // tal3 får värdet "105"
rf 2.1 Deklarationer – följande meningar är instruktioner till datorn på ren svenska. Skriv om dem till Java.
a) Reservera 4 byte för ett nytt heltal.
b) Reservera 2 byte för ett nytt heltal och ge det värdet 5.
c) Reservera 4 byte för ett nytt flyttal och ge det värdet 3,3.
d) Reservera 8 byte för ett nytt flyttal och ge det värdet 9,90.
e) Reservera 2 byte för ett nytt tecken och ge det värdet T.
rf 2.2 Typomvandlingar – vad ska det stå i den tomma parentesen för att det ska bli rätt?
a) double skoNr = 39; int helaSkoNr = ( )skoNr;
b) float antalTusenlappar = 2.5f; int helaTusenlappar = ( )antalTusenlappar;
c) short teckenkod = 100; char tecken = ( )teckenkod;
d) String år = "1945"; int årtal = Integer.valueOf( );
rf 2.3 Beräkningar – vad blir resultatet av följande uträkningar?
a) double höjd = 3.0; double bas = 5.0; double triangelArea = bas * höjd / 2; triangelArea =
b) int höjd = 3; int bas = 5; double triangelarea = bas * höjd / 2; triangelArea =
rf 2.4 Strängar – vad blir resultatet av följande operationer?
double bas = 3.0; // Rektangelns bas i cm. double höjd = 4.0; // Rektangelns höjd i cm.
String area = (bas*höjd) + " cm2."; // Rektangelarea i cm.
String info = "Basen "+bas+" och höjden "+höjd+" ger arean "+area;
area innehåller:
info innehåller:
2.1 Skriv ett program där man kan mata in en triangels bas och höjd och som beräknar arean.
2.2 Skriv ett program där man kan mata in ett svenskt ord och dess engelska översättning, och som skriver ut dem i en sammanslagen text.
Svenska: häst
Engelska: horse
häst heter ”horse” på engelska.
2.3 Skriv ett program där man kan mata in ett substantiv i singular och en pluraländelse, och som visar hur ordet används i en mening:
Substantiv: boll
Pluraländelse: -ar
En boll, flera bollar.
2.4 Skriv ett program som i övning 2.7, men i stället för att mata in ett tecken och visa teckenkoden ska användaren kunna göra tvärtom – mata in ett tal och få se vilket tecken det representerar.
2.5 Du har övat på att omvandla ett decimaltal till ett heltal så att decimalerna försvinner. Nu ska du skriva ett program som gör en riktig avrundning. 38.4 ska bli 38 och 38.6 ska bli 39. Ett enkelt trick är att addera 0.5 till talet innan typomvandlingen som tar bort decimalerna. Tabellen nedan visar principen för några exempel:
2.6 a) Skriv ett program för en uttagsautomat där man kan skriva in ett belopp, och som visar hur stort uttag man gjorde. Vi antar att automaten bara har hundralappar, så om man skriver till exempel 670 ska det stå:
Uttag: 700 kr.
2.6 b) Det blir lite svårare om automaten även har 500-lappar. Utöka programmet i uppgift a så att automaten svarar så här istället (om man skriver in 670):
Uttag i 500-sedlar: 500 kr.
Uttag i 100-sedlar: 200 kr.





Att försöka förutse möjliga fel som kan uppträda när ett program körs och hantera dem är viktigt för att göra programmet stabilt.
Förutom att krascha programmet, eller i värsta fall hela datorn, kan en bugg innebära att programmet ger felaktiga resultat. Beroende på vad programmet används till kan det vara mer eller mindre allvarligt, men oavsett vilket är det alltid fruktansvärt irriterande för användaren.
De flesta fel som uppstår under en programkörning genererar så kallade undantagsfel, på engelska exceptions. Ett undantagsfel är ett fel som gör att programmet inte bör köra vidare utan att felet hanteras. Vanliga fel är att programmet försöker genomföra en ogiltig operation, eller komma åt odefinierade delar av minnet, till exempel genom att skriva ett värde till den sjunde platsen i ett fält som bara har fem element, eller genom att använda en referens som är null
Om sådana fel inte hanteras är det oftast bättre att avsluta programmet. För användaren ser det ut som om programmet har kraschat, vilket man kan säga att det har. Men notera att en programkrasch inte är det värsta som kan hända. Det värsta som kan hända är att programmet kör vidare med felaktiga resultat, eller oavsiktligt skriver över data på fel plats i minnet utan att man märker det. Ibland är det bättre att låta programmet krascha. Ännu bättre är det förstås att fånga upp undantagsfel och hantera dem så att programmet kan fortsätta.
Betrakta följande exempel på ett program där användaren kan mata in en sträcka och en tid. Genom att trycka på en knapp räknas hastigheten ut.
private void btnBeräknaActionPerformed ( java.awt.event.ActionEvent evt ) {
String sträcka = txfSträcka.getText();
String tid = txfTid.getText();
float s = Float.valueOf( sträcka ); float t = Float.valueOf( tid );
float v = s / t;
String hastighet = String.valueOf( v ); txfHastighet.setText( hastighet ); }
Metoden Float.valueOf tar en text, till exempel "35" och omvandlar den till flyttalsvärdet 35.0. Men om användaren skriver "asf" kommer metoden att generera ett fel som talar om att ”asf” har fel format, för det går inte att tolka som ett tal.
Den här typen av fel kallas för undantagsfel (på engelska exceptions). Även om programmet (i det här fallet) inte kraschar är det bäst att fånga upp felet och hantera det så att användaren förstår att något gått fel. För detta ändamål finns de två nyckelorden try och catch.
En bättre version av Exempel 15.1a ovan skulle kunna se ut som på följande sida.
private void btnBeräknaActionPerformed(java.awt.event.ActionEvent evt) {
String sträcka = txfSträcka.getText(); String tid = txfTid.getText();
float s = 0, t = 1;
try {
s = Float.valueOf( sträcka );
t = Float.valueOf( tid ); }
catch ( java.lang.NumberFormatException error ) { JOptionPane.showMessageDialog(null, "Värden måste skrivas in i sifferform", "Fel nummerformat", JOptionPane.ERROR_MESSAGE);
return; // Avbryt beräkningen }
float v = s / t;
String hastighet = String.valueOf( v ); txfHastighet.setText( hastighet ); }
De satser som kan generera felet står inskrivna i ett try-block. Det innebär att programmet bevakar dem så att om de genererar ett undantagsfel fångas felet upp. I så fall exekveras catch-blocket, som fungerar som en metod. Den tar emot felet som en parameter, kallad error i exemplet. error innehåller en beskrivning av felet, men den kan verka kryptisk för en vanlig användare, och det kan vara bättre att visa en mer hjälpsam text som beskriver felet. Det kan ske med en meddelanderuta av typen JOptionPane.
Exemplet är fortfarande inte helt felsäkert, för användaren kan skriva in tiden 0, och division med 0 ska undvikas. Det vore bra med ytterligare en if-sats som efter inmatningen kontrollerar värdet på variabeln t. Om t är 0 kan man visa ett meddelandefönster igen och sedan avbryta koden med return, så att divisionen aldrig genomförs. Det är alltid en god idé att kontrollera nämnaren innan en division.
Ett vanligt undantagsfel är att försöka komma åt ett element i en lista på en plats som inte finns. Övning 13.3 är ett program där det finns risk att användaren anger ett index som inte finns till ett fält. Gå tillbaka till den övningen och felsäkra den allt du kan med hjälp av try-catch. Om du redan gjort övningen behöver du inte göra om allting. Uppdatera koden med felkontroll till en ny version. När du är klar, be en kompis att försöka krascha ditt program om det går.
Den här boken riktar sig mot nybörjaren i programmering. Det krävs inga förkunskaper annat än lite datorvana för att kunna installera nödvändig programvara. Det finns gratis programvara som kan användas för att arbeta med boken. I boken används NetBeans, men man kan utan större problem använda andra liknande utvecklingsmiljöer som till exempel Eclipse.
Boken är främst avsedd att användas som kurslitteratur till gymnasieämnet Programmering nivå 1. Boken kan också vara till god hjälp för den som vill lära sig programmering på egen hand.
Denna tredje upplaga av boken har kompletterats med ett nytt kapitel om felhantering för att bättre motsvara ändringarna i 2025 års gymnasiereform.
Extra lärarmaterial finns som digitalt lärarmaterial. Extramaterialet består av färdiga programfiler till samtliga exempel, övningar och uppgifter, provförslag m.m. och kan hämtas digitalt. Det kan bespara läraren en hel del arbete med att förbereda presentationer eller demonstrationer av bokens innehåll.
Författare till Programmering 1 Java är Magnus Lilja, Ulrik Nilsson och Bo Silborn. Alla tre har mångårig erfarenhet av att undervisa i programmering.


