Eerste Java-programma’s
BeginnerLes 1 van 11 in Cursus Java programmeren: klassen, overerving, collecties en streams
Wat je leert
- Bouw een compleet Java-programma rond een main-methode, maak er met de compiler en het Java-startprogramma een uitvoerbaar programma van, herstel de fouten die het tegenhouden en geef tekst precies zoals bedoeld weer.
- Bouw een programma rond de main-methodeHerken de onderdelen van een minimaal Java-programma, plaats instructies op de juiste plek binnen de main-methode en volg de regels voor namen, accolades, puntkomma’s en commentaar.
- Compileer, voer uit en herstel foutenZet broncode met de JDK om in een uitvoerbaar programma en onderscheid compilatiefouten, uitvoeringsfouten en logische fouten, zodat je die allemaal kunt vinden en herstellen.
- Geef tekst weer met print en printlnGeef tekst en waarden regel voor regel op het scherm weer, bepaal waar nieuwe regels beginnen en gebruik escapesequenties voor aanhalingstekens, tabs en backslashes.
- Bouw een programma rond de main-methode
- Declareer variabelen en werk die bij, kies voor elke waarde een geschikt primitief type en sla tekst op en combineer die in String-waarden.
- Declareer variabelen, wijs waarden toe en werk die bijMaak variabelen met een type en een naam, geef ze waarden, volg de naamgevingsregels en voorspel de waarde van elke variabele tijdens de uitvoering van een programma.
- Kies een primitief type en schrijf literalsKies het juiste primitieve type voor gehele getallen, kommagetallen, tekens en waarheidswaarden, schrijf literals van elk type en herken wanneer een waarde niet binnen het type past.
- Sla tekst op en voeg die samen met concatenatieSla tekst op in String-variabelen en bouw uitvoer op door strings, getallen en variabelen samen te voegen met de operator +, waarbij je precies voorspelt wat wordt weergegeven.
- Declareer variabelen, wijs waarden toe en werk die bij
- Schrijf rekenkundige expressies die Java in de bedoelde volgorde evalueert, gebruik geheeltallige deling en de rest correct en reken met kommagetallen en de Math-klasse.
- Schrijf expressies met operatoren en houd rekening met hun prioriteitCombineer waarden met rekenkundige operatoren, voorspel in welke volgorde Java die evalueert en werk variabelen bij met samengestelde toewijzing en increment.
- Gebruik geheeltallige deling en de restVoorspel de resultaten van / en % bij gehele getallen, gebruik ze om hoeveelheden in eenheden op te splitsen en herken deling door nul.
- Reken met kommagetallen en de Math-klasseReken met double-waarden, gebruik de kant-en-klare methoden van de Math-klasse voor wortels, machten en afronden en presenteer resultaten met een passend aantal decimalen.
- Schrijf expressies met operatoren en houd rekening met hun prioriteit
- Voorspel welke conversies Java automatisch uitvoert, schrijf casts waar een conversie informatie kan verliezen en zet tekst om naar getallen en getallen naar tekst.
- Gebruik verbredende en expliciete typeconversiesOnderscheid automatische verbredende typeconversies van versmallende conversies waarvoor een cast nodig is, plaats casts zo dat berekeningen het bedoelde resultaat geven en voorspel wat een cast met een waarde doet.
- Zet tekst om naar getallen en omgekeerdZet strings met getallen om naar int- en double-waarden, zet getallen om naar strings en herken de fout die Java geeft bij tekst die geen geldig getal is.
- Gebruik verbredende en expliciete typeconversies
- Lees tekst en getallen die de gebruiker typt, presenteer resultaten in een duidelijke opmaak en combineer invoer, berekening en uitvoer in kleine, geteste programma’s.
- Lees invoer met ScannerMaak een Scanner voor toetsenbordinvoer, lees regels, woorden en getallen met de juiste methode en vermijd de veelvoorkomende valkuilen met regeleinden, verkeerde invoer en decimaaltekens.
- Maak uitvoer op met printfGeef getallen weer met een vast aantal decimalen, lijn uitvoer uit in kolommen met printf en String.format en weet hoe de instellingen van de computer het decimaalteken veranderen.
- Combineer invoer, berekening en uitvoerPlan, schrijf en test complete programma’s die waarden lezen, er met de juiste typen mee rekenen en duidelijke resultaten weergeven.
- Lees invoer met Scanner
Eerste Java-programma’s: uitleg
1Schrijf, compileer en voer een Java-programma uit
Een Java-programma begint als tekst, maar de computer heeft een precieze structuur nodig om die tekst als instructies te kunnen uitvoeren. Bouw een kleine klasse rond een main-methode en volg daarna de broncode tijdens het compileren en uitvoeren. Weergegeven berichten maken elke stap zichtbaar. Als iets mislukt, vertelt de fase waarin dat gebeurt je of je de broncode moet inspecteren, een exceptie tijdens de uitvoering moet lezen of het resultaat moet vergelijken met wat je verwachtte.
1.1 Bouw een programma rond de main-methode
Een eerste Java-programma geeft de computer een korte lijst met instructies. De omringende klasse en main-methode vertellen Java waar die instructies horen en waar de uitvoering begint.
Plaats instructies binnen main
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
De buitenste accolades omsluiten de klassebody. De binnenste accolades omsluiten de methodebody. Wanneer dit programma start, voert Java de eerste instructie binnen main uit. Meer instructies die daaronder staan, worden van boven naar beneden uitgevoerd. Wanneer main klaar is, eindigt dit kleine programma.
Neem public static void main(String[] args) zorgvuldig over. Hier zorgt public ervoor dat het startprogramma de methode kan aanroepen, maakt static uitvoering mogelijk zonder eerst een object te maken en geeft void aan dat de methode geen resultaat teruggeeft. String[] args ontvangt woorden die op de opdrachtregel na de programmanaam zijn getypt. Je kunt een bericht weergeven zonder die woorden te gebruiken.
Laat leestekens en namen overeenkomen
Een instructie zoals System.out.println("Hi"); eindigt met een puntkomma. Bij een openingsaccolade { hoort een sluitaccolade }. De hierboven getoonde klasse- en methodekop openen blokken; vervang die openingsaccolades niet door puntkomma’s. Als je de instructie vier spaties verder laat inspringen dan de methodekop, wordt de nesting zichtbaar.
Sla public class Hello op in Hello.java. De naam van de publieke klasse en het deel vóór .java moeten exact overeenkomen, inclusief hoofdletters. Als de declaratie public class Other luidt, moet het bestand Other.java heten. Een compilermelding dat de klasse in een ander bestand moet worden gedeclareerd, wijst op dit verschil.
Java is hoofdlettergevoelig. De naam System moet met een hoofdletter S beginnen; system.out.println("Hi"); compileert niet. Een methode met de naam Main is een andere methode dan main. Een klasse met alleen Main kan compileren, maar het startprogramma kan de bedoelde startmethode niet vinden wanneer je het programma uitvoert.
Maak de code leesbaar
Gebruik één instructie per regel en laat elk niveau tussen accolades vier spaties inspringen. De meeste spaties en regeleinden tussen code-elementen hebben geen invloed op het compileren. Spaties binnen tekst tussen aanhalingstekens hebben wel invloed op de uitvoer. Klassenamen staan volgens de conventie in PascalCase, zoals TravelTime.
Commentaar legt code uit aan mensen. Java negeert alles na // op die regel. Blokcommentaar begint met /* en eindigt met */ en kan meerdere regels beslaan. Nuttig commentaar legt een reden uit, zoals // Convert hours to seconds naast een omzetting waarvan het doel misschien onduidelijk is.
Herken de kortere vorm
Java 25 en later ondersteunen ook een compact bronbestand:
void main() {
IO.println("Hello, world!");
}
Deze vorm laat de expliciete klassedeclaratie weg. IO.println geeft een regel weer en IO.readln("Your name: ") toont een invoervraag en geeft de getypte regel terug. De klassieke vorm met een klasse werkt ook met oudere Java-versies; beide vormen hebben een main-methode waar de uitvoering begint.
Belangrijkste punten
- Plaats uitvoerbare instructies binnen de main-methode en zorg dat elke openingsaccolade een sluitaccolade heeft.
- Sluit een instructie zoals een aanroep voor uitvoer af met een puntkomma.
- De publieke klasse
Hellohoort inHello.java; hoofdletters zijn belangrijk. - Commentaar legt code uit aan lezers en wordt tijdens het compileren genegeerd.
- Java 25 voegt een compacte bronvorm toe; de klassieke vorm met een klasse werkt ook in oudere versies.
1.2 Compileer, voer uit en herstel fouten
Broncode schrijven en een programma uitvoeren zijn afzonderlijke stappen. Java controleert en vertaalt je code eerst en voert die daarna uit. Als je weet welke stap is mislukt, kun je bepalen waar je moet zoeken.
Compileer de broncode en start daarna de klasse
Broncode is de tekst in een .java-bestand. De compiler, javac, vertaalt geldige broncode naar bytecode in een .class-bestand. De Java Virtual Machine (JVM) voert die bytecode uit. Met een geschikte JVM kan dezelfde bytecode op verschillende besturingssystemen worden uitgevoerd.
Open een terminal in de map met Hello.java en voer in:
javac Hello.java
java Hello
De eerste opdracht maakt Hello.class als het compileren slaagt. De tweede start het programma. Het argument is de klassenaam, zonder .class: met java Hello.class vraag je het startprogramma naar de verkeerde klassenaam te zoeken en dat mislukt.
De JDK, oftewel Java Development Kit, levert beide opdrachten. Een IDE, zoals IntelliJ IDEA, Eclipse, NetBeans of Visual Studio Code met Java-ondersteuning, compileert en start het programma wanneer je op de uitvoerknop drukt. De omgeving kan fouten markeren terwijl je typt, maar het zijn nog steeds fouten in dezelfde Java-taal.
Sinds Java 11 biedt de bronbestandsmodus een kortere route voor één klein programma:
java Hello.java
Hiermee wordt de broncode in het geheugen gecompileerd en uitgevoerd zonder een .class-bestand achter te laten. Houd de twee vormen uit elkaar: java Hello start een gecompileerde klasse, terwijl java Hello.java broncode start.
Lees compilatiefouten
Een compilatiefout verhindert dat de code met succes wordt gecompileerd. Een ontbrekende puntkomma kan bijvoorbeeld dit opleveren:
Hello.java:3: error: ';' expected
System.out.println("Hello")
^
De melding geeft het bestand, de regel en de plek aan waar de compiler het probleem opmerkte. De werkelijke fout kan eerder staan: een niet-afgesloten aanhalingsteken op één regel kan latere regels verstoren. Lees de gemarkeerde regel en de regel ervoor. Herstel de eerste gemelde fout en compileer opnieuw voordat je meerdere andere regels wijzigt. Eén reparatie kan veel latere meldingen laten verdwijnen.
Onderscheid uitvoeringsfouten van verkeerde antwoorden
| Soort probleem | Wat gebeurt er | Hoe onderzoek je het |
|---|---|---|
| Compilatiefout | De broncode kan niet met succes worden gecompileerd. | Lees de eerste compilermelding en inspecteer de code eromheen. |
| Uitvoeringsfout | De uitvoering stopt met een exceptie. | Lees de exceptie en zoek de opgegeven regel. |
| Logische fout | De uitvoering eindigt, maar het resultaat is verkeerd. | Vergelijk de uitvoer met een met de hand berekend resultaat. |
Als een variabele divisor van een geheel type nul bevat, mislukt 5 / divisor tijdens de uitvoering met ArithmeticException: / by zero. De rekenkundige instructie kan geldige broncode zijn, ook al veroorzaken de waarden tijdens de uitvoering een fout.
Een programma dat een gemiddelde van 8 weergeeft terwijl de juiste waarde ongeveer 8,33 is, heeft een logische fout. Geen compilermelding kan je vertellen dat dit voor jouw taak het verkeerde resultaat is. Test met bekende invoer, inspecteer tussenwaarden en zoek de eerste onjuiste berekening.
Werk in een korte cyclus: bewerken, opslaan, compileren, uitvoeren, testen. Opslaan is belangrijk: compileren leest het opgeslagen bestand, dus niet-opgeslagen wijzigingen kunnen het gecompileerde programma niet veranderen.
Belangrijkste punten
javac Hello.javacompileert broncode;java Hellovoert de resulterende klasse uit.- De JDK levert ontwikkelopdrachten; de JVM voert bytecode uit.
- Herstel de eerste compilatiefout en compileer opnieuw voordat je latere meldingen onderzoekt.
- Een exceptie tijdens de uitvoering stopt het programma; voor een logische fout moet je het resultaat vergelijken met het verwachte resultaat.
1.3 Geef tekst weer met print en println
Weergegeven uitvoer is de eerste manier om te zien wat een programma doet. Met Java bepaal je welke tekens worden weergegeven en waar de volgende regel begint.
Volg de uitvoerpositie
System.out.print(...) schrijft de waarde en laat de uitvoerpositie op dezelfde regel staan. System.out.println(...) schrijft de waarde en begint daarna een nieuwe regel. Een aanroep van System.out.println() met lege haakjes voegt alleen een regeleinde toe.
System.out.print("Hello");
System.out.print(", ");
System.out.println("world");
System.out.println("Bye");
De eerste twee aanroepen laten de positie achter de spatie na de komma staan. De derde voegt world op die positie toe en gaat dan naar een nieuwe regel. De exacte uitvoer is:
Hello, world
Bye
Java voegt geen spaties tussen aanroepen in. Als je de spatie in ", " verwijdert, wordt de eerste regel “Hello,world”. Een lege println() tussen de laatste twee instructies zou een lege regel tussen de berichten maken.
Bepaal of je tekst of een waarde wilt
Een stringliteral is tekst tussen dubbele aanhalingstekens. Als je "7 * 6" weergeeft, verschijnt de tekst “7 * 6”. Als je 7 * 6 weergeeft, wordt de vermenigvuldiging geëvalueerd en verschijnt “42”. De aanhalingstekens zijn leestekens in de code; ze worden niet als onderdeel van de literal weergegeven.
Als name bijvoorbeeld “Ada” bevat, geeft System.out.println(name); “Ada” weer, terwijl System.out.println("name"); “name” weergeeft. Gebruik de variabele zonder aanhalingstekens als je de opgeslagen waarde wilt.
Enkele aanhalingstekens hebben een andere rol. 'A' is één char-waarde. 'Hello' kan geen bericht met meerdere tekens bevatten en veroorzaakt een compilatiefout. Gebruik "Hello" voor die tekst.
Zet speciale tekens in een string
Een escapesequentie begint met een backslash en stelt een teken binnen de literal voor.
| Code binnen een literal | Weergegeven teken |
|---|---|
\n | Nieuwe regel |
\t | Tab |
\" | Dubbel aanhalingsteken |
\\ | Eén backslash |
Bijvoorbeeld:
System.out.println("She said \"hi\"");
System.out.println("C:\\Users");
Deze instructies geven She said "hi" en C:\Users weer, op afzonderlijke regels. De extra backslashes vertellen Java hoe het volgende teken moet worden geïnterpreteerd; ze worden niet allemaal naar de uitvoer gekopieerd.
Eén aanroep kan ook meerdere regels weergeven:
System.out.println("Name:\tAda\nAge:\t36");
De tab scheidt het label van de waarde en \n zet de leeftijd op de volgende regel. De aanroep van println voegt ook zelf een afsluitend regeleinde toe. Een tab gaat naar een tabstop, dus de zichtbare breedte hangt af van de uitvoeromgeving.
Een gewone stringliteral tussen aanhalingstekens moet op dezelfde bronregel beginnen en eindigen. Als je midden in de literal op Enter drukt, blijft die onafgesloten. Om een lang bericht over bronregels te verdelen, schrijf je twee volledige literals die je met + verbindt, of gebruik je afzonderlijke aanroepen voor uitvoer.
Belangrijkste punten
printblijft op de huidige regel;printlnvoegt na de waarde een regeleinde toe.- Aanhalingstekens maken tekst letterlijk:
"name"geeft die letters weer, terwijlnamede waarde van de variabele weergeeft. - Gebruik escapesequenties voor nieuwe regels, tabs, aanhalingstekens en backslashes.
- Spaties binnen een string worden exact weergegeven; aanroepen voor uitvoer voegen geen scheidende spaties toe.
- Gebruik dubbele aanhalingstekens voor een string en enkele aanhalingstekens voor één
char-waarde. - Een gewone stringliteral begint en eindigt op één bronregel.
2Sla gegevens op in variabelen van het juiste type
Met variabelen kan een programma waarden tussen instructies bewaren, maar elke opgeslagen waarde heeft een type. Volg toewijzingen stap voor stap om te zien wat verandert en wat vast blijft. Kies typen voor gehele getallen, kommagetallen, tekens of waarheidswaarden die bij de gegevens passen en combineer daarna tekst en waarden tot leesbare berichten. Kleine verschillen in de schrijfwijze van literals of de volgorde van plustekens kunnen zowel het type als het resultaat van een expressie veranderen.
2.1 Declareer variabelen, wijs waarden toe en werk die bij
Een variabele geeft een waarde een naam, zodat latere instructies die kunnen gebruiken. Het type vertelt Java welke soort waarde de variabele kan bevatten; een toewijzing verandert de opgeslagen waarde.
Declareer en initialiseer
int age;
age = 36;
De declaratie introduceert age als een int. De toewijzing slaat 36 op. De gecombineerde vorm int age = 36; heet initialisatie. Een lokale variabele moet een waarde krijgen voordat je die leest. Als je int age; declareert en direct daarna age weergeeft, krijg je een foutmelding dat de variabele mogelijk niet is geïnitialiseerd.
Declareer een naam één keer binnen dezelfde methodebody. Om de waarde later te veranderen, schrijf je age = 37;, zonder int te herhalen. Een tweede int age = 37; in die body probeert dezelfde variabele opnieuw te declareren.
Lees een toewijzing van rechts naar links
De rechterkant van = wordt eerst berekend. Java slaat dat resultaat daarna op in de variabele links:
int count = 5;
count = count + 1;
De tweede instructie leest de huidige waarde 5, telt er 1 bij op en slaat 6 op. Het teken = betekent toewijzing, geen wiskundige bewering dat een getal gelijk is aan zichzelf plus één. De linkerkant moet een plek aangeven waar de waarde kan worden opgeslagen; 36 = age; is ongeldig.
Een toewijzing kopieert de waarde op dat moment:
int a = 5;
int b = a;
a = 10;
Nu bevat a de waarde 10 en b de waarde 5. Er blijft geen verbinding bestaan die b opnieuw berekent als a verandert.
Volg een verwisseling
Stel dat first de waarde 4 bevat en second de waarde 9. De reeks first = second; second = first; verliest de 4 bij de eerste stap en laat beide waarden op 9 staan. Bewaar eerst de oorspronkelijke waarde:
int temp = first;
first = second;
second = temp;
| Na instructie | first | second | temp |
|---|---|---|---|
int temp = first; | 4 | 9 | 4 |
first = second; | 9 | 9 | 4 |
second = temp; | 9 | 4 | 4 |
Een traceertabel legt elke variabele na elke instructie vast. Bij int x = 3; x = x * 2; x = x + 1; zijn de waarden eerst 3, dan 6 en dan 7. Werk telkens één rij bij met de laatst opgeslagen waarden.
Kies bruikbare namen en vaste typen
Namen mogen letters, cijfers, onderstrepingstekens en dollartekens bevatten. Ze mogen niet met een cijfer beginnen of een gereserveerd woord zoals class zijn. Hoofdletters zijn belangrijk: total en Total verschillen. Gebruik beschrijvende namen in camelCase, zoals distanceKm of secondsLeft.
Aan een final-variabele kun je maar één keer een waarde toewijzen. final int SECONDS_PER_HOUR = 3600; geeft een vaste omrekeningsfactor een duidelijke naam. Een nieuwe toewijzing compileert niet. Namen van constanten bestaan volgens de conventie uit hoofdletters, met onderstrepingstekens tussen de woorden.
Sinds Java 10 kan var het type van een lokale variabele afleiden uit de initialisatiewaarde. var count = 10; leidt int af; var price = 2.5; leidt double af. Het afgeleide type blijft vast. var count; mislukt omdat er geen initialisatiewaarde is waaruit een type kan worden afgeleid.
Belangrijkste punten
- Een declaratie geeft een variabele een naam en een type; initialisatie geeft de variabele ook een beginwaarde.
- Een toewijzing evalueert de rechterkant en slaat daarna het resultaat links op.
- Een waarde kopiëren verbindt variabelen niet; gebruik een tijdelijke variabele wanneer je waarden verwisselt.
- Lees een lokale variabele pas nadat die een waarde heeft gekregen.
finalvoorkomt hertoewijzing envarleidt een vast type af uit een initialisatiewaarde.
2.2 Kies een primitief type en schrijf literals
Het type van een waarde bepaalt het bereik, de schrijfwijze van de literal en de berekeningen die Java ermee kan uitvoeren. Gebruik int voor gewone aantallen en double voor gewone metingen, en herken ook de andere primitieve typen.
Vergelijk de acht primitieve typen
| Type | Opslag en waarden |
|---|---|
byte | Geheel getal van 8 bits: −128 tot 127 |
short | Geheel getal van 16 bits: −32.768 tot 32.767 |
int | Geheel getal van 32 bits: −2.147.483.648 tot 2.147.483.647 |
long | Geheel getal van 64 bits: −9.223.372.036.854.775.808 tot 9.223.372.036.854.775.807 |
float | Zwevendekommagetal van 32 bits; ongeveer 7 significante cijfers |
double | Zwevendekommagetal van 64 bits; ongeveer 15–17 significante cijfers |
char | Eén UTF-16-code-eenheid van 16 bits: 0 tot 65.535 |
boolean | true of false |
Eindige float-waarden lopen bij benadering van −3,4 × 10³⁸ tot +3,4 × 10³⁸; eindige double-waarden lopen bij benadering van −1,8 × 10³⁰⁸ tot +1,8 × 10³⁰⁸. Deze grote bereiken betekenen niet dat elk kommagetal erin exact kan worden weergegeven.
Een char stelt vaak één teken voor, zoals 'A'. Sommige Unicode-tekens hebben twee UTF-16-code-eenheden nodig, dus één char kan niet elk mogelijk teken voorstellen. 'A' heeft de numerieke code 65, 'a' heeft 97 en '7' heeft 55. Het teken '7' is iets anders dan het gehele getal 7. Een boolean is geen getal: boolean active = 1; mislukt.
Schrijf literals passend bij hun type
Een literal schrijft een waarde rechtstreeks in de broncode. 42 is een int-literal, 42L een long, 3.5 een double en 3.5f een float. Tekenliterals gebruiken enkele aanhalingstekens; String-literals gebruiken dubbele aanhalingstekens. Namen van primitieve typen schrijf je met kleine letters, terwijl String met een hoofdletter begint.
Schrijf long large = 3000000000L;. Zonder de L is die literal voor een geheel getal te groot. Schrijf float rate = 3.5f;: 3.5 zonder toevoeging heeft het type double, dat Java niet stilzwijgend versmalt naar float. Een constante met een geheel getal dat past, kan een kleiner geheel type initialiseren: byte b = 100; compileert, maar byte b = 200; niet.
Onderstrepingstekens tussen cijfers maken een literal leesbaar: 1_000_000 heeft dezelfde waarde als 1000000. Wetenschappelijke notatie gebruikt e, zoals in 1.5e3, wat 1500,0 betekent. Decimalen in broncode gebruiken altijd een punt.
Let op het bereik van de bewerking
Bij een berekening met gehele getallen kan overloop optreden zonder foutmelding. Als je 1 optelt bij de grootste int, loopt de waarde door naar de kleinste int. Het product 50_000 * 50_000 gebruikt int-rekenkunde en levert -1794967296 op. In 50_000L * 50_000 is één operand een long, waardoor het product de juiste waarde 2500000000 heeft.
Als je alleen de ontvangende variabele verandert in een long, ben je te laat om een int-product te herstellen waarbij al overloop is opgetreden. Kies vóór de vermenigvuldiging een operand met een voldoende groot bereik.
Zwevendekommawaarden hebben een andere beperking. Veel decimale breuken worden opgeslagen als binaire benaderingen: 0.1 + 0.2 geeft 0.30000000000000004 weer. Maak zulke resultaten op voor de weergave. Bij exacte geldberekeningen kun je hele centen opslaan in een long; de klasse BigDecimal is een andere mogelijkheid om exact met decimalen te rekenen.
Belangrijkste punten
- Java heeft acht primitieve typen;
Stringis een klasse. - Gebruik de achtervoegsels van een literal om
long(L) offloat(f) te kiezen. - Bij berekeningen met gehele getallen kan ongemerkt overloop optreden; verbreed een operand vóór de berekening.
- Zwevendekommatypen slaan veel decimale breuken bij benadering op.
- Een
charslaat één UTF-16-code-eenheid op, terwijl eenbooleaneen waarheidswaarde opslaat. - Een decimaal getal in broncode gebruikt een punt, ook op een computer die decimale komma’s gebruikt.
2.3 Sla tekst op en voeg die samen met concatenatie
Een String bevat tekst, met bijvoorbeeld spaties, cijfers en leestekens, of helemaal geen tekens. De operator + kan die tekst combineren met andere waarden om een bericht op te bouwen.
Voeg waarden samen tot tekst
String firstName = "Ada";
String lastName = "Lovelace";
System.out.println(firstName + " " + lastName);
De uitvoer is “Ada Lovelace”. De middelste literal levert de spatie. Zonder die literal zou firstName + lastName de uitvoer “AdaLovelace” opleveren. Concatenatie voegt zelf geen scheidingstekens toe.
Concatenatie betekent waarden samenvoegen tot een nieuwe string. Als een van beide operanden van + een String is, zet Java de andere waarde om naar tekst en voegt die samen. Zo wordt "Age: " + 36 de tekst “Age: 36” en wordt "Price: " + 2.5 de tekst “Price: 2.5”. De cijfers in het resultaat maken nu deel uit van een tekstwaarde.
String begint met een hoofdletter S. Anders dan de acht primitieve typen is het een klasse. Als je string name = "Ada"; met een kleine s schrijft, compileert de code niet. De lege string "" is geldige tekst zonder tekens; het is geen ontbrekende waarde.
Volg plustekens van links naar rechts
Bekijk:
System.out.println("Sum: " + 2 + 3);
De eerste + voegt de String en 2 samen tot “Sum: 2”. De tweede voegt die String en 3 samen tot “Sum: 23”. Zodra het tussenresultaat tekst is, blijft de volgende + tekst samenvoegen.
Vergelijk drie vormen:
| Expressie | Resultaat | Reden |
|---|---|---|
"Sum: " + 2 + 3 | "Sum: 23" | Bij de eerste optelling is tekst aanwezig. |
2 + 3 + " apples" | "5 apples" | De eerste bewerking telt twee getallen op. |
"Sum: " + (2 + 3) | "Sum: 5" | Door de haakjes vindt de optelling eerst plaats. |
Gebruik haakjes wanneer een bericht het resultaat van een optelling of aftrekking moet bevatten. "Diff: " + (5 - 2) geeft bijvoorbeeld “Diff: 3”. Zonder haakjes probeert "Diff: " + 5 - 2 2 van een String af te trekken en compileert de code niet.
Vermenigvuldigen en delen hebben een hogere prioriteit dan +. De expressie "Area: " + 4 * 5 berekent eerst het product en geeft “Area: 20”.
Bouw een bericht in stappen op
String message = "Hi";
message += "!";
De bijgewerkte variabele bevat “Hi!”. Bij een String voegt += tekst achteraan toe door het samengevoegde resultaat weer aan de variabele toe te wijzen. Je kunt met meerdere instructies een kort bericht samenstellen en het aan het einde één keer weergeven.
Let op bij tekens. Twee char-operanden leiden niet tot Stringconcatenatie. 'A' + 'B' telt hun numerieke codes, 65 en 66, op en levert de int 131 op. Als je met de lege String begint, verandert de keten: "" + 'A' + 'B' maakt eerst “A” en daarna “AB”. Aanhalingstekens bepalen de typen van de operanden en dus ook de betekenis van +.
Belangrijkste punten
- Concatenatie voegt tekst samen; er worden geen extra spaties ingevoegd.
- Een keten van
+-bewerkingen verloopt van links naar rechts nadat bewerkingen met een hogere prioriteit zijn uitgevoerd. - Zet een optelling of aftrekking met getallen tussen haakjes voordat je het resultaat samenvoegt met een label.
- Twee
char-waarden worden als getallen opgeteld, tenzij een String al deel uitmaakt van de bewerking.
3Reken met rekenkundige expressies
Berekeningen hangen af van zowel de volgorde van bewerkingen als de typen van hun operanden. Volg expressies voordat je ze uitvoert, vooral wanneer een deling in een grotere berekening voorkomt. Met geheeltallige deling en resten splits je hoeveelheden op in groepen of tijdseenheden; rekenen met kommagetallen behoudt breukdelen. Kant-en-klare Math-methoden verwerken wortels, machten en afrondingen, met retourtypen die van belang zijn wanneer je de resultaten opslaat.
3.1 Schrijf expressies met operatoren en houd rekening met hun prioriteit
Een expressie combineert waarden om een resultaat op te leveren. Java evalueert die volgens de operatorprioriteit; daarna kan een instructie dat resultaat opslaan of weergeven.
Schrijf de bewerkingen expliciet
De rekenkundige operatoren zijn +, -, *, / en %: optellen, aftrekken, vermenigvuldigen, delen en rest. Met int width = 4; en int height = 5; wordt width * height geëvalueerd tot 20.
Elke vermenigvuldiging heeft * nodig. De algebraïsche vorm 2(3 + 4) is ongeldige Java-code; schrijf 2 * (3 + 4). Java heeft geen rekenkundige machtsoperator. 2 ^ 3 betekent een bitsgewijze bewerking en levert 1 op, geen 8. Om een waarde te kwadrateren schrijf je x * x; gebruik Math.pow om een andere macht te berekenen.
Pas de prioriteit toe voordat je van links naar rechts leest
| Volgorde | Operatoren of groepering |
|---|---|
| Eerst | Haakjes |
| Daarna | Unair minteken en casts |
| Daarna | *, /, % |
| Als laatste | +, - |
Op hetzelfde niveau worden deze rekenkundige operatoren van links naar rechts gegroepeerd. 2 + 3 * 4 is 14; (2 + 3) * 4 is 20. In 10 - 4 - 3 geeft de eerste aftrekking 6 en de tweede 3. In 24 / 4 * 2 geeft de deling 6 en de vermenigvuldiging 12. Om 4 * 2 als noemer te behandelen, zijn haakjes nodig.
Bereken een gemiddelde correct
Stel int a = 7, b = 8, c = 10;. De expressie a + b + c / 3 deelt alleen c. Door geheeltallige deling is 10 / 3 gelijk aan 3 en de optellingen geven daarna 18.
(a + b + c) / 3 groepeert het hele totaal, 25, maar beide operanden van / zijn gehele getallen. Het resultaat is 8. Met (a + b + c) / 3.0 blijft het breukdeel behouden en krijg je 8.333333333333334.
De typen van de operanden bepalen de berekening. Twee int-operanden leveren een int-resultaat op. Door een double-operand wordt de andere numerieke operand omgezet naar double, zoals in 5 * 2.0, met als resultaat 10.0. De ontvangende variabele verandert niet hoe de eerdere berekening is uitgevoerd.
Werk een opgeslagen waarde bij
int total = 10;
total += 5;
total *= 2;
total--;
De opgeslagen waarden worden achtereenvolgens 10, 15, 30 en 29. Voor deze int-operanden voert total += 5; dezelfde bijwerking uit als total = total + 5;. De operatoren -=, /= en %= combineren op dezelfde manier een bewerking met een toewijzing. count++; verhoogt een variabele met 1 en count--; verlaagt die met 1. Als je ze als afzonderlijke instructies gebruikt, is hun effect gemakkelijk te volgen.
Een expressie zoals a + b verandert geen van beide operanden. Om het resultaat te gebruiken, wijs je het toe of geef je het door aan een aanroep voor uitvoer: int sum = a + b; of System.out.println(a + b);. De losse regel a + b; compileert niet, omdat Java die rekenkundige expressie niet als zelfstandige instructie toestaat. Toewijzingen, increments, decrements en methodeaanroepen kunnen zelfstandig voorkomen en kunnen effecten hebben.
Belangrijkste punten
- Gebruik expliciete operatoren:
*vermenigvuldigt en^berekent geen macht. - Pas eerst de prioriteit toe; werk op hetzelfde rekenkundige niveau van links naar rechts.
- Zet een volledig totaal tussen haakjes voordat je het deelt om een gemiddelde te vinden.
- De typen van de operanden bepalen de resultaten van de berekening voordat de toewijzing plaatsvindt.
- Samengestelde toewijzing slaat een bijgewerkte waarde op; zelfstandige
++en--veranderen die met 1.
3.2 Gebruik geheeltallige deling en de rest
Geheeltallige deling geeft antwoord op de vraag hoeveel complete groepen passen. De rest vertelt je wat overblijft. Samen splitsen deze bewerkingen een hoeveelheid op in bruikbare delen.
Voorspel quotiënt en rest
Als beide operanden gehele getallen zijn, laat / het breukdeel weg en gaat de uitkomst richting nul. 7 / 2 is 3, 2 / 3 is 0 en -7 / 2 is −3. Dit is afkappen, geen afronding op het dichtstbijzijnde gehele getal.
De restoperator % geeft terug wat na de deling overblijft. 17 / 5 geeft 3 en 17 % 5 geeft 2. Drie groepen van 5 zijn samen 15, zodat 2 overblijft. Voor gehele operanden en een deler ongelijk aan nul reconstrueert (a / b) * b + a % b de waarde a met Java-rekenkunde voor gehele getallen.
Het teken van een rest ongelijk aan nul volgt de linkeroperand: -7 % 3 is −1, terwijl 7 % -3 gelijk is aan 1. Voor niet-negatieve gehele getallen is n % 2 gelijk aan 0 bij even waarden en 1 bij oneven waarden.
Splits seconden op in grotere eenheden
Begin met 3725 seconden:
int totalSeconds = 3725;
int hours = totalSeconds / 3600;
int secondsAfterHours = totalSeconds % 3600;
int minutes = secondsAfterHours / 60;
int seconds = secondsAfterHours % 60;
De eerste deling vindt 1 volledig uur. De rest is 125 seconden. Als je die rest deelt door 60, vind je 2 minuten, met 5 seconden over. Het resultaat is 1 h 2 min 5 s. Als je het totaal opnieuw opbouwt, krijg je 3600 seconden plus 120 seconden plus 5 seconden, oftewel 3725.
Gebruik de rest na het verwijderen van uren om de minuten binnen het huidige uur te vinden. Als je het oorspronkelijke totaal door 60 deelt, krijg je alle 62 volledige minuten, inclusief de minuten die al als een uur zijn meegeteld.
Met dezelfde operatoren haal je decimale cijfers uit een niet-negatief geheel getal. 4827 % 10 geeft het laatste cijfer, 7; 4827 / 10 geeft de resterende voorste cijfers, 482.
Onderscheid volle groepen van voldoende verpakkingen
Voor 50 eieren en dozen waarin 12 eieren passen, geeft 50 / 12 4 volle dozen en geeft 50 % 12 2 eieren over. Om alle eieren te verpakken is een vijfde doos nodig. Voor niet-negatieve aantallen en positieve doosgroottes rondt de expressie met gehele getallen (count + size - 1) / size het aantal verpakkingen naar boven af, mits bij de optelling geen overloop optreedt. Voor dit voorbeeld geeft (50 + 12 - 1) / 12 de waarde 5.
Kies een deling met breukdeel voordat die plaatsvindt
| Expressie | Opgeslagen of berekend resultaat |
|---|---|
double result = 7 / 2; | 3.0 |
double result = 7 / 2.0; | 3.5 |
double result = (double) 7 / 2; | 3.5 |
Een double als doel kan een weggelaten breukdeel niet terughalen. Maak een operand vóór de deling een double wanneer je het breukdeel nodig hebt.
Deling of restbepaling met het gehele getal nul werpt tijdens de uitvoering een ArithmeticException op. Zwevendekommagetallen gedragen zich bij deling anders: 5.0 / 0 geeft Infinity, -5.0 / 0 geeft -Infinity en 0.0 / 0 geeft NaN, wat “geen getal” betekent. Een resultaat kan dus onbruikbaar zijn, ook wanneer de uitvoering niet stopt.
Belangrijkste punten
- Geheeltallige
/kapt af richting nul;%geeft de rest terug. - Een rest ongelijk aan nul bij gehele getallen heeft het teken van het deeltal.
- Gebruik opeenvolgende quotiënten en resten om seconden op te splitsen in uren, minuten en seconden.
- Volle dozen en de dozen die voor alle voorwerpen nodig zijn, beantwoorden verschillende vragen.
- Maak vóór de deling een operand
doubleom een breukdeel te behouden. - Geheeltallige deling door nul werpt een exceptie op; een zwevendekomma-deling kan oneindigheid of
NaNopleveren.
3.3 Reken met kommagetallen en de Math-klasse
Rekenen met kommagetallen is nuttig voor metingen en gemiddelden. De klasse Math voegt kant-en-klare berekeningen toe, terwijl je met afronden kunt kiezen hoe je een resultaat opslaat of presenteert.
Behoud breukdelen en herken benaderingen
150 / 2.5 geeft 60.0, een snelheid in km/h als de afstand 150 km is en de tijd 2,5 uur. Omdat een operand een double is, behoudt de deling zo nodig een breukdeel in het resultaat. Gewone doubles met een gehele waarde worden met een decimaal deel weergegeven, zoals 60.0.
Een double slaat van veel decimale waarden een binaire benadering op. Daardoor geeft 1.1 * 3 de uitvoer 3.3000000000000003 en 10.0 / 3 de uitvoer 3.3333333333333335. Behoud de waarde voor latere berekeningen en rond die af bij de presentatie.
Grote of kleine waarden kunnen in wetenschappelijke notatie worden weergegeven. 1.23456789E7 stelt 12.345.678,9 voor en 1.0E-4 stelt 0,0001 voor. Voor positieve eindige waarden wordt gewone notatie gebruikt vanaf 0,001 tot maar niet met 10.000.000. Wetenschappelijke notatie verandert de weergegeven vorm, niet de onderliggende waarde.
Roep nuttige Math-methoden aan
Math staat in java.lang, dus er is geen import nodig.
| Aanroep | Resultaat en doel |
|---|---|
Math.sqrt(16) | 4.0, een vierkantswortel |
Math.pow(2, 10) | 1024.0, een macht |
Math.abs(-7) | 7, een absolute waarde |
Math.max(3, 9) | 9, de grootste waarde |
Math.min(3, 9) | 3, de kleinste waarde |
Math.sqrt en Math.pow geven double terug. De constante Math.PI is ongeveer 3,141592653589793. Voor een cirkel met straal 2,5 cm geeft Math.PI * 2.5 * 2.5 de waarde 19.634954084936208 cm², ongeveer 19,63 cm². Voor een rechthoekige driehoek met rechthoekszijden van 3 cm en 4 cm telt Math.sqrt(3 * 3 + 4 * 4) eerst de gekwadrateerde rechthoekszijden op tot 25 en geeft daarna 5.0 cm.
Kies een afrondingsrichting
| Aanroep | Resultaat |
|---|---|
Math.round(2.4) | 2 |
Math.round(2.5) | 3 |
Math.round(-2.5) | -2 |
Math.floor(2.7) | 2.0 |
Math.ceil(2.1) | 3.0 |
Math.floor(-2.7) | -3.0 |
round kiest het dichtstbijzijnde gehele getal, waarbij waarden precies halverwege richting positieve oneindigheid gaan. floor gaat naar beneden, richting negatieve oneindigheid; ceil gaat naar boven, richting positieve oneindigheid. Bij negatieve getallen betekent “naar beneden” een negatievere waarde, dus naar beneden afronden van −2,7 geeft −3,0.
Voor een double-argument geeft Math.round een long terug. Sla dat resultaat op in een long of zet het expliciet om wanneer een int passend is: int rounded = (int) Math.round(2.7); slaat 3 op. floor en ceil geven double-waarden terug.
Om een opgeslagen waarde op twee decimalen af te ronden, gebruik je Math.round(12.3456 * 100) / 100.0, wat 12.35 geeft. Door eerst te vergroten, komt de positie van de honderdsten op de grens van de gehele getallen te liggen. Delen door 100.0 verkleint de waarde weer met een zwevendekomma-deling; delen door het gehele getal 100 zou het breukdeel weglaten en 12 geven. Als alleen de weergegeven tekst moet worden afgerond, kan printf de oorspronkelijke waarde direct opmaken.
Belangrijkste punten
- Een
doublebehoudt breukdelen in resultaten, maar benadert veel decimale breuken. Math.sqrt,Math.powenMath.PIondersteunen meetkundige berekeningen zonder import.roundkiest het dichtstbijzijnde gehele getal;floorenceilkiezen een richting.Math.round(double)geeftlongterug, terwijlfloorenceildoubleteruggeven.- Gebruik een deler met een decimaal bij het terugschalen van een afgeronde waarde om het breukdeel te behouden.
4Zet waarden om naar andere typen
Een waarde kan worden omgezet tussen numerieke typen of tussen getallen en tekst. Elke route heeft eigen regels: sommige numerieke conversies gaan automatisch, sommige vereisen een cast en numerieke tekst moet vóór een berekening worden geparseerd. Volg de conversie op het precieze moment waarop die plaatsvindt. Omzetten na een bewerking kan eerder verloren informatie niet terughalen, terwijl een geslaagde conversie een grote waarde of een waarde met een breukdeel toch kan veranderen.
4.1 Gebruik verbredende en expliciete typeconversies
Java zet een numerieke waarde soms automatisch om. Andere conversies hebben een expliciete cast nodig. Een cast verandert het type van een waarde op een bepaalde plek in een expressie, dus de plaats beïnvloedt het antwoord.
Verbreed automatisch
De belangrijkste route voor numerieke verbreding is byte → short → int → long → float → double. Een char wordt ook verbreed naar int en verder. Zo slaat double d = 5; de waarde 5.0 op en past elke int-waarde exact in een long.
Verbreding naar een zwevendekommatype kan precisie verliezen. Bij int naar float, long naar float en long naar double kan een groot geheel getal worden afgerond. De conversie van int naar double is exact. Zo wordt (float) 16777217 de waarde 1.6777216E7, die 16.777.216 voorstelt.
Gebruik een cast voor een versmallende conversie
Bij een cast schrijf je het doeltype tussen haakjes vóór de waarde:
int n = (int) 3.99;
Het opgeslagen resultaat is 3. Zonder (int) wijst Java de toewijzing van de double-literal aan een int af. De conversie van een eindige double binnen het bereik naar een geheel getal kapt af richting nul: (int) -3.99 geeft eveneens −3. Afkappen verschilt van afronden; (int) Math.round(3.99) geeft 4.
Versmallende conversies hebben meestal een cast nodig. Een nuttige uitzondering staat toe dat een constante expressie met een geheel getal dat past, een byte, short of char initialiseert. Zo is byte b = 100; geldig zonder (byte). Voor een niet-constante int-variabele geldt deze uitzondering voor constante toewijzingen niet alleen omdat de huidige waarde past.
Zet de cast vóór de bewerking waarvoor die nodig is
Neem int sum = 25; en int count = 3;.
| Expressie | Wat gebeurt er | Resultaat |
|---|---|---|
(double) sum / count | Zet sum om en deel daarna met een double. | 8.333333333333334 |
(double) (sum / count) | Deel gehele getallen en zet daarna het gehele resultaat om. | 8.0 |
Een cast heeft een hogere prioriteit dan vermenigvuldigen en delen. Haakjes bepalen of de cast geldt voor één operand of een voltooide berekening. Een cast na geheeltallige deling kan weggelaten informatie niet herstellen.
Voorspel veranderingen in tekens en kleine gehele getallen
(int) 'A' geeft de tekencode 65. Als je 1 bij 'A' optelt, krijg je de int 66. Om het volledige resultaat weer om te zetten naar een teken, schrijf je (char) ('A' + 1), wat 'B' geeft. Zonder de buitenste haakjes rond de som zou de cast alleen voor 'A' gelden.
Een versmallende conversie tussen gehele typen behoudt alleen de laagste bits. (byte) 200 wordt −56; (int) 3_000_000_000L wordt −1294967296. Een cast staat de conversie toe, maar controleert niet of de oorspronkelijke waarde past.
Samengestelde toewijzing heeft een ingebouwde conversie naar het type links. Met int x = 10; berekent x += 2.7; de waarde 12,7 en versmalt die naar 12. De gewone toewijzing x = x + 2.7; mislukt omdat de rechterkant double is.
Belangrijkste punten
- Verbreding gaat automatisch, maar sommige conversies naar een zwevendekommatype kunnen grote gehele getallen afronden.
- Een versmallende conversie heeft meestal een cast nodig; voor passende gehele constanten geldt een uitzondering bij toewijzing aan een klein type.
- Een cast van een kommagetal binnen het bereik naar een geheel getal kapt af richting nul.
- Gebruik vóór de deling een cast op een operand als de bewerking een breukdeel moet behouden.
- Een versmallende conversie tussen gehele typen kan een waarde veranderen door hoge bits weg te laten.
- Samengestelde toewijzing bevat een conversie terug naar het type van de variabele.
4.2 Zet tekst om naar getallen en omgekeerd
Tekst kan cijfers bevatten zonder een getal te zijn. Om met getypte of opgeslagen tekst te rekenen, parseer je die naar een numeriek type. Om een bericht op te bouwen, zet je een numerieke waarde weer om naar tekst.
Parseer tekst voordat je rekent
De expressie "42" + 1 levert “421” op. Omdat de linkeroperand een String is, voert + concatenatie uit. Integer.parseInt("42") + 1 levert 43 op, omdat parsen vóór de optelling een int oplevert.
String first = "12";
String second = "30";
int total = Integer.parseInt(first) + Integer.parseInt(second);
Hier bevat total de waarde 42. Samenvoegen van de oorspronkelijke strings zou “1230” geven. Kies de conversie op basis van het beoogde gebruik van de waarde, niet op basis van de vraag of de tekens toevallig op een getal lijken.
Integer.parseInt(text) geeft een int terug; Long.parseLong(text) geeft een long terug. Integer.valueOf("42") geeft een Integer-object terug, dat Java automatisch omzet naar int wanneer een int nodig is. Voor een directe omzetting van tekst naar int maakt parseInt het bedoelde resultaat duidelijk.
Parseer kommagetallen en waarheidswaarden
Double.parseDouble("3.75") geeft de double 3,75 terug. De tekstnotatie gebruikt op elke computer een decimale punt, ongeacht de regio-instellingen. Double.parseDouble("3,5") mislukt. Ook Java-broncode gebruikt bij literals een punt, al kunnen methoden voor toetsenbordinvoer een taal- en regio-instelling volgen.
Boolean.parseBoolean(text) volgt een andere regel: de methode geeft true terug voor “true” in elke combinatie van hoofdletters en kleine letters, zoals “TRUE”. Alle andere tekst geeft false terug, waaronder “yes”. Een algemeen bevestigend woord wordt niet als waar geïnterpreteerd.
Herken ongeldige numerieke tekst
Ongeldige numerieke tekst veroorzaakt een NumberFormatException terwijl het programma draait. Integer.parseInt("4.5") mislukt omdat decimale tekst geen schrijfwijze van een geheel getal is. Integer.parseInt("") en Integer.parseInt(" 42") mislukken ook. De exceptiemelding geeft aan welke tekst niet kon worden omgezet.
Hoe witruimte wordt behandeld, hangt af van de parser. Double.parseDouble negeert spaties aan het begin en einde, terwijl Integer.parseInt dat niet doet. Kies bij het lezen van gebruikersgegevens testinvoer die deze verschillen zichtbaar maakt.
Een handig invoerpatroon is om één hele regel te lezen en te parsen:
int age = Integer.parseInt(scanner.nextLine());
double height = Double.parseDouble(scanner.nextLine());
Elke aanroep verwerkt de hele regel, inclusief het regeleinde. Daardoor blijven tekstuele en numerieke invoer consistent en voorkom je dat je het lezen van tokens en het lezen van hele regels door elkaar gebruikt.
Zet een getal om naar tekst
String.valueOf(42), Integer.toString(42) en "" + 42 leveren allemaal de String “42” op. Double.toString(2.50) levert “2.5” op. De oorspronkelijke decimale schrijfwijze blijft niet aan het opgeslagen getal verbonden, dus deze conversie voegt geen nul aan het einde toe om die schrijfwijze te behouden.
Gebruik String.format wanneer je opgeslagen tekst met een vast aantal decimalen nodig hebt. Gebruik printf wanneer je die opgemaakte tekst direct wilt weergeven. Een numerieke cast en eenvoudige concatenatie zorgen geen van beide voor een weergave met een vast aantal van twee decimalen.
Belangrijkste punten
- Tekst die op een getal lijkt, blijft een String totdat die wordt geparseerd.
Integer.parseIntenDouble.parseDoubleleveren numerieke waarden op om mee te rekenen.Double.parseDoublegebruikt een decimale punt, ongeacht de taal- en regio-instelling.- Ongeldige numerieke tekst veroorzaakt
NumberFormatException; bij het parsen van gehele getallen worden spaties eromheen afgewezen. Boolean.parseBooleanaccepteert “true” ongeacht het gebruik van hoofdletters en geeft voor andere tekst false terug.- Een eenvoudige conversie van getal naar tekst behoudt extra nullen aan het einde niet.
5Lees invoer en bouw complete programma’s
Invoer en uitvoer maken van een berekening een programma dat iemand kan gebruiken. Kies voor elke invoervraag een passende Scanner-leesmethode, bepaal hoe kommagetallen worden ingevoerd en kies duidelijke uitvoerlabels en getalnotaties. Bouw een compleet programma vanuit een invoer–berekening–uitvoerplan en test het daarna met resultaten die je met de hand hebt berekend. Een programma kan compileren en met succes eindigen terwijl het toch de verkeerde regel leest of de verkeerde waarde weergeeft.
5.1 Lees invoer met Scanner
Toetsenbordinvoer komt binnen als tekst. Een Scanner kan een hele regel of één woord lezen, of een woord lezen en omzetten naar een getal. Kies een consistent leesplan voordat je de gebruiker om waarden vraagt.
Maak één Scanner en lees een regel
import java.util.Scanner;
public class Greeting {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("What is your name? ");
String name = scanner.nextLine();
System.out.println("Hello, " + name + "!");
}
}
De import komt vóór de klasse. De instructie die de Scanner maakt, komt binnen main en verbindt de Scanner met System.in. Eén Scanner is genoeg voor dit programma. nextLine() wacht op de getypte regel en geeft de tekst zonder het regeleinde terug. Als je “Ada” typt, geeft de laatste instructie “Hello, Ada!” weer. Door print voor de invoervraag te gebruiken, blijft de invoer naast de vraag staan.
Kies regels of tokens
| Methode | Wat de methode leest |
|---|---|
nextLine() | De rest van de huidige regel, zonder het regeleinde |
next() | Het volgende door witruimte gescheiden token als tekst |
nextInt() | Het volgende token als een int |
nextLong() | Het volgende token als een long |
nextDouble() | Het volgende token als een double |
nextBoolean() | Het volgende token als een waarheidswaarde |
Bij “Ada Lovelace” geeft next() “Ada” terug. Een daaropvolgende nextLine() geeft “ Lovelace” terug, inclusief de spatie vooraan. Twee aanroepen van nextInt() kunnen “3 4” van één regel lezen. Een numeriek token dat niet bij de methode past, zoals “4.5” of “abc” voor nextInt(), veroorzaakt een InputMismatchException.
Houd rekening met het ongelezen regeleinde
Stel dat de gebruiker “30” typt, op Enter drukt, daarna “Ada Lovelace” typt en op Enter drukt. Deze code leest de naam niet zoals bedoeld:
int age = scanner.nextInt();
String name = scanner.nextLine();
nextInt() verwerkt 30 maar laat het regeleinde staan. nextLine() verwerkt direct de lege rest van diezelfde regel, dus name is "". Voeg scanner.nextLine(); toe tussen de twee instructies om die rest weg te lezen voordat je de naam op de volgende regel leest.
Een andere oplossing is om elk antwoord met nextLine() te lezen en numerieke regels te parsen: int age = Integer.parseInt(scanner.nextLine());. Zo voorkom je dat je wisselt tussen twee verschillende invoereenheden.
Maak de decimaalnotatie duidelijk
nextDouble() volgt de taal- en regio-instelling van de Scanner, aanvankelijk de standaardopmaakinstelling van de computer. Een instelling met een decimale komma accepteert in dit voorbeeld “3,5” als kommagetal en wijst “3.5” af. Om kommagetallen met een punt consequent te lezen, voeg je import java.util.Locale; toe en maak je:
Scanner scanner = new Scanner(System.in).useLocale(Locale.US);
Een hele regel lezen met Double.parseDouble(scanner.nextLine()) gebruikt ook een punt. Als je de taal- en regio-instelling van de Scanner verandert, veranderen Java-literals in broncode en de instelling voor latere aanroepen van printf niet.
Lees waarden in de volgorde waarin de invoervragen erom vragen. Als je om een naam en daarna om een leeftijd vraagt, moet de eerste leesactie de naam opslaan. Een leesactie op de verkeerde plek kan gegevens in de verkeerde variabele plaatsen of een conversiefout veroorzaken.
Belangrijkste punten
- Importeer
java.util.Scannervóór de klasse en maak één Scanner binnenmain. nextLine()leest de rest van een regel; tokenmethoden lezen door witruimte gescheiden waarden.- Een numeriek token van de verkeerde soort veroorzaakt
InputMismatchException. - Lees na een numeriek token de rest van de regel weg voordat je tekst op de volgende regel leest.
useLocale(Locale.US)legt vast dat Scanner-invoer een decimale punt gebruikt; regels parsen is een andere consistente aanpak.- Lees invoer in dezelfde volgorde als de invoervragen.
5.2 Maak uitvoer op met printf
Opgemaakte uitvoer bepaalt hoe waarden binnen een bericht verschijnen. Met printf kun je een vast aantal decimalen tonen, een regeleinde toevoegen en waarden in kolommen uitlijnen zonder hun opgeslagen waarden te veranderen.
Koppel tijdelijke aanduidingen aan waarden
Een opmaakstring bevat gewone tekst plus specificaties die met % beginnen. Elke specificatie die een waarde verwerkt, neemt de volgende waarde die na de opmaakstring wordt opgegeven:
System.out.printf("%s is %d years old%n", "Ada", 36);
Dit geeft “Ada is 36 years old” weer en begint een nieuwe regel. %s toont tekst of een andere waarde als tekst, %d toont een geheel getal zoals een int of long en %f toont een zwevendekommawaarde. %n voegt een regeleinde in zonder een waarde te verwerken. %% geeft één procentteken weer.
printf voegt niet automatisch een regeleinde toe. Neem %n op wanneer de volgende uitvoer op een nieuwe regel moet beginnen. Een gewone escapesequentie \n stelt ook een nieuweregelteken in Java-tekst voor; %n is het platformspecifieke regelscheidingsteken van de opmaakfunctie.
Stel decimalen voor de weergave in
%f zonder precisie geeft zes plaatsen na het decimaalteken weer: het opmaken van 2.5 geeft “2.500000”. De precisie in %.2f vraagt om twee decimalen:
System.out.printf("Total: %.2f%n", 12.3456);
Met Amerikaanse opmaak is de uitvoer “Total: 12.35”. De waarde wordt afgerond in de weergegeven tekst. Een variabele die 12,3456 bevat, bevat na de weergave nog steeds die waarde voor verdere berekeningen.
Bij System.out.printf("%d items at %.2f each, total %.2f%n", 3, 1.5, 3 * 1.5); vullen de waarden de drie tijdelijke aanduidingen in volgorde in. Met Amerikaanse instellingen is de uitvoer “3 items at 1.50 each, total 4.50”.
Lijn velden uit met breedte
Een breedte is een minimale veldgrootte. %5d lijnt een geheel getal rechts uit binnen minstens vijf tekens; %-6s lijnt tekst links uit binnen minstens zes tekens. %6.1f combineert breedte 6 met één decimaal.
System.out.printf("[%5d][%-6s][%6.1f]%n", 42, "Ada", 9.25);
Met Amerikaanse instellingen is de exacte uitvoer [ 42][Ada ][ 9.3]. De vierkante haken maken de opvulling zichtbaar. Een waarde die langer is dan de breedte wordt nog steeds volledig weergegeven; de breedte kapt geen tekens af.
Een specificatie die niet past, veroorzaakt een uitvoeringsfout. printf("%d%n", 2.5) compileert maar werpt IllegalFormatConversionException op, omdat %d een geheel getal verwacht. Te weinig opgegeven waarden, zoals in printf("%d %d%n", 2), veroorzaken MissingFormatArgumentException.
Kies uitvoer of opgeslagen tekst
String.format past dezelfde opmaakregels toe, maar geeft een String terug:
String line = String.format("%.1f km", 12.345);
Met Amerikaanse instellingen bevat line de tekst “12.3 km”; die instructie heeft niets weergegeven.
Beide opmaakmethoden gebruiken de standaardinstelling voor taal en regio, tenzij je er een meegeeft. Voeg import java.util.Locale; toe en gebruik dan System.out.printf(Locale.US, "%.2f%n", 12.3456); om “12.35” te krijgen in plaats van de “12,35” die een instelling met een decimale komma gebruikt. Ook String.format kan Locale.US als eerste argument krijgen. Een double weergeven met println gebruikt een punt, ongeacht de taal- en regio-instelling voor de opmaak.
Belangrijkste punten
- Koppel elke specificatie die een waarde verwerkt aan de volgende waarde van een geschikt type.
- Gebruik
%nvoor een regeleinde en%%voor een letterlijk procentteken. %.2frondt de weergegeven tekst af op twee decimalen zonder de opgeslagen waarde te veranderen.- Breedte vult een veld aan tot een minimale grootte; langere waarden worden niet afgekapt.
String.formatgeeft tekst terug, terwijlprintfdie weergeeft.- Geef een taal- en regio-instelling mee om het decimaalteken in opgemaakte uitvoer te bepalen.
5.3 Combineer invoer, berekening en uitvoer
Een compleet rekenprogramma verbindt drie stappen: lees de invoer, reken ermee en geef de resultaten weer. Als je de waarden en hun eenheden plant voordat je begint te typen, helpt dat bij het kiezen van typen en het testen van het resultaat.
Plan een reistijdprogramma
De invoer bestaat uit afstand in kilometers en gemiddelde snelheid in km/h. Als je de afstand deelt door de snelheid, krijg je de tijd in uren. Beide metingen hebben double nodig, zodat de deling een breukdeel kan behouden. De uitvoer bestaat uit hele uren en minuten, afgerond op de dichtstbijzijnde minuut.
import java.util.Scanner;
public class TravelTime {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Distance (km): ");
double distance = Double.parseDouble(scanner.nextLine());
System.out.print("Speed (km/h): ");
double speed = Double.parseDouble(scanner.nextLine());
int totalMinutes = (int) Math.round(distance / speed * 60);
int hours = totalMinutes / 60;
int minutes = totalMinutes % 60;
System.out.println("Travel time: " + hours + " h " + minutes + " min");
}
}
Bij 150 km met 80 km/h geeft de deling 1,875 uur. Vermenigvuldiging met 60 geeft 112,5 minuten. Math.round geeft de long 113 terug en de cast zet die om naar int. Geheeltallige deling en rest geven daarna 1 uur en 53 minuten. De uitvoer is “Travel time: 1 h 53 min”.
Als afstand en snelheid allebei int waren, zou 150 / 80 * 60 de waarde 60 opleveren. Het breukdeel verdwijnt bij de deling, vóór de vermenigvuldiging. Typekeuzes horen thuis in het plan, niet alleen in de laatste instructie voor uitvoer.
Kies weergave en berekening afzonderlijk
Voor een rekening van in totaal 87,60, verdeeld over 4 personen, sla je het totaal op in double en het aantal in int. double share = total / people; geeft 21,9. Met Amerikaanse opmaak geeft System.out.printf("Each person pays %.2f%n", share); de uitvoer “Each person pays 21.90”. De opmaak levert de tweede decimaal zonder de berekening te veranderen.
Voor de scores als gehele getallen 7, 8 en 10 geeft double average = (a + b + c) / 3.0; de waarde 8.333333333333334, die met %.2f als “8.33” wordt weergegeven. De haakjes groeperen het totaal en de deler met een decimaal behoudt het breukdeel.
Test met resultaten die je kent
Bereken verwachte resultaten voordat je het programma uitvoert. Voor reistijd zou 120 km met 60 km/h de uitvoer 2 h 0 min moeten geven. Een afstand van 0 km bij een positieve snelheid zou 0 h 0 min moeten geven. Probeer invoer dicht bij een afrondingsgrens en grotere geldige afstanden om meer dan alleen de eenvoudigste berekening te testen.
Neem nul, negatieve en grote invoer op wanneer je het gedrag van het programma controleert. Bepaal of elke invoer voor de taak zinvol is. Bij een aantal van nul personen levert total / people de waarde Infinity op wanneer total een double ongelijk aan nul is; geheeltallige deling door nul werpt ArithmeticException op. Een geslaagde uitvoering alleen bewijst niet dat het antwoord bruikbaar is.
Als de uitvoer afwijkt van je verwachting, geef dan tussenwaarden weer of volg die in een tabel. Zoek de eerste verkeerde waarde, herstel de verantwoordelijke instructie en voer de bekende tests opnieuw uit. Vergelijk naast getallen ook spaties en labels.
Gebruik namen zoals totalMinutes, benoemde constanten zoals MINUTES_PER_HOUR, eenheden in invoervragen en kort commentaar dat het doel van een berekening uitlegt.
Belangrijkste punten
- Zet invoer, uitvoer, formules, eenheden en typen op een rij voordat je een rekenprogramma schrijft.
- Behoud breukdelen van metingen tijdens berekeningen en rond daarna af wanneer de uitvoer om hele eenheden vraagt.
- Test gewone invoer, grenswaarden en ongeschikte invoer tegen het verwachte gedrag.
- Volg tussenwaarden om de eerste onjuiste stap te vinden.
- Duidelijke namen, constanten en eenheden maken een programma gemakkelijker te controleren.
Eerste Java-programma’s: voorbeelden
1Bouw en voer een klein programma met een bericht uit
13 stappen
- 1IntroductieVolg instructies vanaf main
Een Java-programma heeft een startpunt en een reeks instructies nodig. In de klassieke vorm bevat een klasse
mainen bevatmainde instructies die worden uitgevoerd.Je bouwt een kort bericht, start het programma en volgt de uitvoerpositie door meerdere aanroepen voor uitvoer. Dezelfde volgorde helpt bij het opsporen van fouten: controleer eerst of de broncode compileert, dan of het programma wordt uitgevoerd en daarna of de uitvoer overeenkomt met het bedoelde bericht.
- 2VoorbeeldPlaats het bericht binnen de methode
Begin met deze volledige structuur:
public class Notice { public static void main(String[] args) { System.out.println("Studio open"); } }De buitenste accolades omsluiten de klasse; het binnenste paar omsluit de methode. Java begint met de instructie voor uitvoer binnen
main. De puntkomma sluit de instructie af, terwijl de sluitaccolades de twee omringende body’s afsluiten. - 3TipControleer namen voordat je meer code toevoegt
Sla de publieke klasse
Noticeop inNotice.java. Neem de hoofdletterNexact over. Behoud ookSystemen de methodemainmet kleine letters: Java behandelt verschillende schrijfwijzen met hoofdletters als verschillende namen.Laat elke geneste body vier spaties inspringen, zodat een verkeerd geplaatste accolade gemakkelijk opvalt. Kort commentaar met
//kan een reden voor een stap uitleggen zonder een uitvoerbare instructie te worden. - 4UitdagingHerstel de startmethode
Een bestand declareert correct
public class Bulletin, maar de enige methode ispublic static void Main(String[] args). Het bestand compileert en het startprogramma kan de main-methode niet vinden. Welke wijziging is nodig?---reveal---
Verander
Maininmain. De naam met een hoofdletter declareert een andere methode en levert dus niet het bedoelde startpunt. Het bestand moet ookBulletin.javablijven heten, zodat de naam overeenkomt met de publieke klasse. - 5UitlegCompileer en start het berichtprogramma
Voer vanuit de broncodemap in:
javac Notice.java java Noticejavaccontroleert de broncode en maakt de bytecodeNotice.class.javastart de JVM om die klasse uit te voeren. Een JDK levert beide opdrachten; een IDE voert deze fasen uit achter de uitvoerknop. Laat in de startopdracht voor een gecompileerde klasse de extensie.classweg.java Notice.javais een afzonderlijke vorm om een bronbestand te starten, beschikbaar sinds Java 11. - 6UitdagingLees eerst de eerste fout
Nadat een cursist het afsluitende aanhalingsteken van een bericht heeft verwijderd, ziet die meerdere compilermeldingen op die regel en latere regels. Moet elke latere instructie direct worden herschreven? Leg de volgende stap uit.
---reveal---
Herstel de eerste fout door de stringliteral af te sluiten, sla op en compileer opnieuw. Door één niet-afgesloten aanhalingsteken kan latere code verkeerd gevormd lijken. Opnieuw compileren laat zien of die latere meldingen verdwijnen voordat verdere wijzigingen nodig zijn.
- 7VoorbeeldVolg de eerste twee aanroepen voor uitvoer
Vervang het oorspronkelijke bericht door:
System.out.print("Studio "); System.out.print(3);De eerste aanroep geeft het woord en de spatie erna weer. Omdat
printgeen regeleinde toevoegt, plaatst de tweede aanroep3direct na die spatie. De huidige uitvoer is “Studio 3” en de volgende aanroep zou nog steeds op deze regel verdergaan. Aanroepen voor uitvoer voegen zelf geen extra scheidingstekens toe. - 8VoorbeeldSluit een regel af en begin een nieuwe
Ga in hetzelfde programma verder met:
System.out.println(" open"); System.out.println("Welcome");De eerste aanroep voegt de spatie vooraan en het woord “open” toe aan de bestaande regel en sluit die regel daarna af. De tweede geeft “Welcome” weer en sluit de volgende regel af. De volledige tekst is:
Studio 3 open WelcomeEr staat geen lege regel tussen de berichten; een lege
println()zou er een toevoegen. - 9KernpuntAanhalingstekens en escapesequenties bepalen de tekst
Aanhalingstekens bepalen of Java letterlijke tekst weergeeft of code evalueert.
println("3 + 4")geeft “3 + 4” weer;println(3 + 4)geeft 7 weer.Om een aanhalingsteken binnen een literal op te nemen, schrijf je
\". Voor een nieuwe regel binnen een literal schrijf je\n; een tab is\ten één backslash is\\. De escapesequenties worden tekens in de resulterende tekst. Een gewone literal zelf moet op één bronregel beginnen en eindigen. - 10UitdagingVoorspel de regelgrenzen
Wat geeft deze code weer?
System.out.print("A"); System.out.println("B"); System.out.println(); System.out.print("C");---reveal---
De eerste regel is “AB”, de tweede regel is leeg en de derde bevat “C”. De eerste aanroep blijft op de regel, de volgende sluit die af en de lege
println()zorgt voor nog een regeleinde. Er staan geen spaties tussen A en B omdat geen enkele instructie er een weergeeft. - 11VerbandBepaal in welke fase de fout ontstaat
Stel dat een aangepast berichtprogramma compileert, start en daarna stopt bij een geheeltallige deling door nul. Dat is een uitvoeringsfout, gemeld met een exceptie. Als het programma eindigt maar een ruimte met het verkeerde nummer aanduidt, is dat een logische fout.
Compileren controleert de regels van Java; de compiler weet niet welke ruimte je bedoelde. Bedenk vóór het testen wat het verwachte bericht is en vergelijk elk label, elke waarde, elke spatie en elk regeleinde.
- 12UitdagingOnderscheid twee reparaties
Een programma compileert eerst niet omdat een instructie voor uitvoer geen puntkomma heeft. Na die reparatie wordt het uitgevoerd, maar geeft het twee berichten op één regel weer terwijl twee regels nodig zijn. Wat moet je in elke fase veranderen?
---reveal---
Voeg de puntkomma toe om de compilatiefout te herstellen. Verander daarna de
printvan het eerste bericht inprintln, of geef daar een regeleinde weer, om de fout in de uitvoerlogica te herstellen. Controleer de tweede wijziging door de werkelijke regelindeling met de verwachte indeling te vergelijken. - 13SamenvattingControleer structuur, uitvoering en uitvoer
Gebruik de structuur van de klasse en
mainom de uitvoerbare instructies te vinden. Laat de naam van de publieke klasse overeenkomen met het bronbestand en compileer en start daarna met de juiste opdrachten.Volg aanroepen voor uitvoer door de huidige uitvoerpositie te volgen:
printblijft staan,printlngaat verder. Bepaal bij een verkeerd resultaat of compilatie is mislukt, de uitvoering is gestopt of de voltooide uitvoer afwijkt van je verwachting. Elk geval vraagt om een andere controle.
2Volg opgeslagen waarden en bouw een bericht op
12 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieVolg waarden voordat je de uitvoer voorspelt
- 2VoorbeeldMaak twee onafhankelijke opgeslagen waarden
- 3VoorbeeldWerk alleen de genoemde doelvariabele bij
- 4UitdagingBewaar een waarde bij het verwisselen
- 5TipGebruik final en var bewust
- 6UitlegKies een type dat bij de gegevens past
- 7VoorbeeldLaat de schrijfwijze van de literal het type bepalen
- 8UitdagingVerbreed vóór de vermenigvuldiging
- 9VoorbeeldBouw een bericht op uit het gevolgde verloop
- 10UitdagingBepaal wanneer plus optellen betekent
- 11UitdagingCombineer een gekopieerde waarde met nieuwe uitvoer
- 12SamenvattingGebruik de nieuwste waarde en het werkelijke type
3Splits een tijdsduur op en reken met breukdelen
14 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieKies de bewerking die bij de vraag past
- 2UitlegGroepeer een volledige berekening
- 3UitdagingHerstel een expressie voor een gemiddelde
- 4VoorbeeldTel volledige uren
- 5VoorbeeldBehoud de seconden na die uren
- 6VoorbeeldHaal minuten en seconden eruit
- 7UitdagingSplits een andere tijdsduur op
- 8KernpuntAfkappen gaat richting nul
- 9VoorbeeldBehoud het breukdeel van een meting
- 10UitlegGebruik Math voor een wortel of macht
- 11UitdagingKies de afrondingsregel
- 12TipSchaal terug met een deler met een decimaal
- 13UitdagingBehoud een gemiddelde voordat je het afrondt
- 14SamenvattingVolg type en groepering bij elke bewerking
4Zet waarden op het juiste moment om
11 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieVraag welke waarde de conversie bereikt
- 2UitlegVerbreed een numerieke waarde automatisch
- 3VoorbeeldVergelijk twee plaatsen voor een cast
- 4UitdagingZet een negatieve waarde om en rond die af
- 5TipZie een cast niet als een bereikcontrole
- 6VoorbeeldParseer voordat je optelt
- 7UitlegStem de parser af op de tekst
- 8UitdagingVoorspel de resultaten van parsen
- 9VerbandBereid tekst voor op de weergave
- 10UitdagingVolg de hele conversieketen
- 11SamenvattingKies een conversie die bij de taak past
5Lees, bereken, maak op en test
16 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieBouw een programma rond de gegevens
- 2UitlegVerbind één Scanner met toetsenbordinvoer
- 3VoorbeeldLees een label als een hele regel
- 4VoorbeeldParseer numerieke regels consequent
- 5UitdagingHerstel een overgeslagen label
- 6TipLeg conventies voor numerieke invoer expliciet vast
- 7VoorbeeldReken met de bedoelde typen
- 8UitlegStem de opmaakstring af op de waarden
- 9VoorbeeldGeef een afgeronde meting weer
- 10UitdagingHerstel de specificatie
- 11VoorbeeldSla opgemaakte tekst op of lijn die uit
- 12UitlegKies tests vóór de uitvoering
- 13UitdagingVind een rekenfout met een test
- 14TipVolg de eerste onverwachte waarde
- 15UitdagingPas het plan toe op een snelheid
- 16SamenvattingControleer de hele weg van invoer naar tekst
Eerste Java-programma’s: oefenvragen
Set 1: Lees en volg je eerste Java-code10 Oefenvragen
Vraag 1 van 10
public class TrailLog. Hoe moet het bronbestand heten?Toon antwoordVerberg antwoord
.java. TrailLog.java behoudt beide hoofdletters in TrailLog. De extensie .class hoort bij gecompileerde bytecode. Als je de broncode TrailLog.class noemt, haal je het invoerbestand en de uitvoer van de compiler door elkaar.Vraag 2 van 10
javac Desk.java slaagt. Welke terminalopdracht start de gecompileerde klasse?Toon antwoordVerberg antwoord
java Desk. Met .class erbij geef je de klasse niet correct aan het startprogramma door. javac compileert broncode; het voert het programma niet uit en de hoofdletters in de klassenaam moeten ongewijzigd blijven.Vraag 3 van 10
Welke exacte tekst wordt weergegeven, als / een regeleinde voorstelt?
System.out.print("Gate ");
System.out.println(4);
System.out.print("Open");
Toon antwoordVerberg antwoord
print("Gate ") laat de positie na de spatie staan, dus println(4) maakt de eerste regel af als “Gate 4” en voegt daarna een regeleinde toe. De laatste aanroep geeft “Open” weer op de volgende regel. Als je alles samenvoegt als “Gate 4Open”, mis je het regeleinde dat println toevoegt.Vraag 4 van 10
Welke waarde bevat saved na deze instructies?
int stock = 8;
int saved = stock;
stock = stock + 6;
Toon antwoordVerberg antwoord
stock naar saved. Een latere bijwerking van stock verandert alleen stock, dus saved blijft 8. Als je 14 verwacht, behandel je de toewijzing als een blijvende verbinding tussen de variabelen, maar Java heeft op één moment een waarde gekopieerd.Vraag 5 van 10
4.25 een float-literal in Java?Toon antwoordVerberg antwoord
f geeft de literal het type float, zoals in 4.25f. Zonder achtervoegsel heeft een decimale literal zoals 4.25 het type double, ook als de waarde in een float zou passen. L markeert een long-literal voor een geheel getal en kan van deze decimale literal geen float maken.Vraag 6 van 10
System.out.println("Seats: " + 6 + 2); weer?Toon antwoordVerberg antwoord
6 + 2 nodig, zodat de getallen vóór de concatenatie worden opgeteld.Vraag 7 van 10
int result = 18 - 6 / 3 * 2;?Toon antwoordVerberg antwoord
6 / 3 geeft 2, vermenigvuldigen met 2 geeft 4 en dat aftrekken van 18 geeft 14. De uitkomst 16 behandelt 3 * 2 als de noemer, hoewel er geen haakjes zijn die die bewerking groeperen.Vraag 8 van 10
-11 / 4?Toon antwoordVerberg antwoord
Vraag 9 van 10
int total = 19; int groups = 4; een quotiënt met een breukdeel?Toon antwoordVerberg antwoord
total vóór de deling maakt één operand een double, zodat de deling 4,75 geeft. Een cast op de al voltooide expressie total / groups geeft slechts 4,0 omdat geheeltallige deling het breukdeel heeft weggelaten. Een cast van het uiteindelijke decimale resultaat naar int zou dat breukdeel ook verliezen.Vraag 10 van 10
Een Scanner ontvangt “27”, Enter, “Mina Chen”, Enter. Wat geeft deze code weer?
int age = scanner.nextInt();
scanner.nextLine();
String first = scanner.next();
String rest = scanner.nextLine();
System.out.println(age + ":" + first + ":" + rest);
Toon antwoordVerberg antwoord
nextLine() leest de lege rest na 27 weg. next() leest daarna “Mina” en de laatste leesactie behoudt de spatie vóór “Chen”, wat “27:Mina: Chen” oplevert. Als je die spatie in de voorspelling weglaat, behandel je nextLine() ten onrechte als een tokenleesactie die witruimte overslaat.Set 2: Kies typen en verbind invoer met uitvoer10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
4.0 weer voor double average = 19 / 4;. Welke soort fout verklaart het onnauwkeurige gemiddelde?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Wat zijn left en right na deze poging om waarden te verwisselen?
int left = 2;
int right = 7;
left = right;
right = left;
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Math.floor(-4.2) terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
String quantity = "16"; Welke expressie maakt van deze tekst het gehele getal 21?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
System.out.printf("Mass: %.2f kg%n", 6.375); met Amerikaanse opmaak weer vóór het regeleinde?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
int km = 45; int minutes = 50; double speed = km / minutes * 60;. Het geeft nul weer. Welke vervanging berekent de snelheid in km/h met behoud van de invoer?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 3: Volg berekeningen en opgemaakte resultaten10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Path: C:\Work weer met precies één backslash?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
System.out.println(3 + 4 + " / " + 3 * 4); weer?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Welke waarde wordt weergegeven?
int value = 20;
value -= 3 * 2;
value /= 4;
System.out.println(value);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
double value = Math.round(8.276 * 100) / 100;?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
(int) -6.8 op?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Integer.parseInt(" 58") wordt geëvalueerd?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
De invoer is “Lina Park” gevolgd door Enter. Welke String krijgt rest?
String first = scanner.next();
String rest = scanner.nextLine();
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
System.out.printf("[%4d][%-5s]", 7, "Oak"); met Amerikaanse opmaak weer?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
int seconds = 7_489; op. Welk paar expressies geeft de volledige uren en de resterende hele minuten binnen het huidige uur?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 4: Vind de eerste stap die verkeerd gaat10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
System.out.println("Ready") af?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
var count = 6; als dezelfde methode count = 6.5; uitvoert?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
int edge = 70_000; long area = edge * edge;. De opgeslagen oppervlakte is verkeerd. Welke vervanging berekent het exacte gehele product en laat edge een int blijven?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Wat geeft deze code weer?
int width = 12;
int height = 7;
int total = 2 * (width + height);
total -= 5;
double part = total / 4;
System.out.println(part);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Math.sqrt(5 * 5 + 12 * 12) terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Wat wordt weergegeven?
int value = 9;
value += 2.8;
double result = value / 4;
System.out.println(result);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Boolean.parseBoolean("Yes") terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
minutes = totalSeconds / 60; seconds = totalSeconds;. Welke correctie herstelt de berekening?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Locale.US en leest twee regels met double mass = scanner.nextDouble(); String label = scanner.nextLine();. De invoer is “2.75”, Enter, “Sample B”, Enter. Welke wijziging behoudt beide bedoelde waarden?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 5: Combineer de regels bij het volgen van complete programma’s10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Wat geeft deze code weer?
int a = 4;
int b = 7;
String text = "R=" + a + b;
a += 2;
text += ":" + (a + b);
System.out.println(text);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Welke waarde wordt weergegeven?
int number = 6_843;
int last = number % 10;
number /= 10;
int next = number % 10;
System.out.println(last * 10 + next);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
'C' weer om naar het teken 'E'?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Wat geeft deze code weer?
int total = 23;
int count = 4;
double a = (double) (total / count);
double b = (double) total / count;
System.out.println((int) (b - a) + ":" + b);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Een Scanner met Locale.US ontvangt “3 2.5”, Enter, “West Lab”, Enter. Welke waarden krijgen name en full?
int count = scanner.nextInt();
double mass = scanner.nextDouble();
String name = scanner.nextLine();
String full = scanner.nextLine();
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Welke tekst wordt met Amerikaanse opmaak opgeslagen in line?
String line = String.format("%d%% / %.1f", 25, 4.25);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
scanner staat klaar en Locale is geïmporteerd.Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Kom je niet uit je eigen opgave? Huiswerkhulp
Kernbegrippen
A
Afkappen
Afronden
B
Blok
boolean
boolean isMember = true; slaat een waarheidswaarde op zonder aanhalingstekens of een getal te gebruiken.Broncode
.java-bestand is opgeslagen voordat de compiler die vertaalt voor uitvoering.Bytecode
.class-bestanden wordt opgeslagen en door een geschikte Java Virtual Machine wordt uitgevoerd.java via de JVM kan uitvoeren.C
char
'7' heeft code 55, dus als je het als char opslaat, wordt het niet de gehele waarde 7.Commentaar
// of tussen /* en */ staat.// Convert to minutes legt uit waarom een tijdberekening een waarde in uren met 60 vermenigvuldigt.Compilatiefout
Compiler
javac Notice.java roep je de compiler aan, die een fout meldt als een puntkomma ontbreekt.Concatenatie
"Count: " + 8 bouwt één bericht met een label, een spatie en een cijfer.Constante
final kan één keer een waarde krijgen en daarna niet opnieuw worden toegewezen.MINUTES_PER_HOUR geeft het getal 60 een nuttige naam in berekeningen voor tijdomrekening.D
Declaratie
int count; introduceert een naam, maar count heeft nog een waarde nodig voordat de variabele wordt gelezen.Decrement
-- voert deze bijwerking uit zonder afzonderlijke toewijzing met aftrekking.secondsLeft--; vermindert het opgeslagen aantal resterende seconden met precies één.Deeltal
/ of % in een Java-delingsexpressie met twee operanden.-11 % 4 verklaart het negatieve deeltal waarom ook de rest ongelijk aan nul negatief is.double
Double.parseDouble
E
Escapesequentie
kan één aanroep voor uitvoer het volgende deel van het bericht op een andere regel plaatsen.Expliciete typeconversie (cast)
(double) total / count verandert de cast het type van een operand voordat de deling wordt uitgevoerd.Expressie
width * height berekent een oppervlakte die je kunt toewijzen of kunt doorgeven aan een aanroep voor uitvoer.F
float
f in 2.75f markeert een float-literal, terwijl 2.75 zonder achtervoegsel een double-literal is.G
Geheeltallige deling
23 / 5 geeft 4 volledige groepen en laat het breukdeel uit het quotiënt weg.I
Increment
++ voert deze bijwerking in één instructie uit.count++; verandert een opgeslagen aantal van 8 naar 9 voordat de volgende instructie wordt uitgevoerd.Initialisatie
double speed = 72.5; declareert speed en initialiseert die met een meting in km/h.InputMismatchException
nextInt(), ontstaat InputMismatchException omdat een geheel getal vereist is.Instructie
System.out.println("Ready"); is één instructie die een bericht en een regeleinde weergeeft.int
int, maar een aantal boven het maximum heeft een groter geheel type nodig.Integer.parseInt
Integer.parseInt("72") geeft 72 terug, maar een spatie vooraan toevoegen maakt die tekst met een geheel getal ongeldig.Invoer–berekening–uitvoerplan
J
JDK
javac en java.JVM
K
Klasse
public class Greeting opent de klasse die de main-methode van het programma bevat.L
Lege string
"" + 'A' + 'B', bouwen de plusbewerkingen tekst op en krijg je de String “AB”.Literal
8, 8L en 8.0 drukken vergelijkbare hoeveelheden uit maar hebben de typen int, long en double.Logische fout
long
5_000_000_000L maakt een literal waarmee je een groot geheel aantal kunt initialiseren.M
main-methode
main plaatst, verschijnen hun berichten in de geschreven volgorde.Math-klasse
Math.sqrt(81) vindt een vierkantswortel zonder import of methodedefinitie.N
NaN
0.0 / 0 levert NaN op in plaats van een exceptie voor geheeltallige deling op te werpen.nextLine
nextLine() direct een lege String teruggeven.NumberFormatException
Integer.parseInt, ontstaat tijdens de uitvoering NumberFormatException.O
Operand
"N=" + count zorgt de String-operand ervoor dat plus tekst samenvoegt in plaats van twee getallen op te tellen.Operatorprioriteit
4 + 3 * 2, dus het product wordt eerst gevormd.Opmaakprecisie
%f stelt die het aantal cijfers na het decimaalteken in.%.2f maakt van een weergegeven 4,5 de tekst “4.50” zonder de numerieke variabele te wijzigen.Opmaakspecificatie
%d voor een geheel getal of %n voor een regeleinde.%f verwerkt een zwevendekommawaarde, terwijl %n een regelscheidingsteken toevoegt zonder een waarde te verwerken.Opmaakstring
"Mass: %.2f kg%n" plaatst een meting met twee decimalen tussen het label en de eenheid.Overloop bij gehele getallen
P
Parsen
Plafondfunctie (ceiling)
Precisie
Primitief type
int is opgeslagen, gebruikt een primitief type, terwijl een naam die als String is opgeslagen een klassetype gebruikt.print("Name: ") kan een gebruiker een antwoord direct naast de invoervraag op het scherm typen.printf
printf("%d items%n", 8) geef je het aantal, het woord “items” en een afsluitend regelscheidingsteken weer.println
println geven twee afzonderlijke regels weer, ook als de literals geen nieuweregeltekens bevatten.R
Rest
% geeft een resultaat ongelijk aan nul met het teken van het deeltal.23 % 5 de 3 onderdelen buiten de volledige groepen.S
Samengestelde toewijzing
total += 5; verhoogt een int-totaal met 5 en slaat de bijgewerkte waarde op in total.Scanner
System.in, kan de naam van een gebruiker lezen en de metingen die een programma nodig heeft.String
"".String.format
String.format(Locale.US, "%.1f km", 8.25) opslaan en die tekst later weergeven.Stringliteral
"Hello, team" bevat een komma en een spatie die exact zo in de uitvoer verschijnen.T
Taal- en regio-instelling (locale)
Locale.US, wordt invoer met een decimale punt consistent op verschillende computers.Testgeval
Toewijzing
count = count + 2; bevat count twee meer dan de waarde die de variabele vóór die instructie bevatte.Token
nextInt() kunnen lezen.Traceertabel
Tussenwaarde
U
Uitvoeringsfout
V
Variabele
distanceKm slaat een meting op die een latere tijdberekening door de snelheid deelt.Veldbreedte
%4d, verschijnen drie spaties vóór het cijfer om het veld van vier tekens te vullen.Verbredende typeconversie
Versmallende typeconversie
Verwachte uitvoer
Vloerfunctie (floor)
W
Wetenschappelijke notatie
E in waarden die Java weergeeft.1.0E-4 stelt 0,0001 voor, dus de negatieve exponent beschrijft een kleine grootte.Z
Zwevendekommabenadering
1.1 * 3 laten zwevendekommabenadering in het weergegeven resultaat zien.- 1Eerste Java-programma’s
- 2Voorwaarden en lussen in Java
- 3Java-methoden
- 4Lijsten, arrays en strings in Java
- 5Java-klassen en objecten
- 6Objecten, referenties en gelijkheid in Java
- 7HashMaps en collecties in Java
- 8Overerving in Java
- 9Excepties en bestanden in Java
- 10Klassendiagrammen en unittests in Java
- 11Lambda-expressies en streams in Java
Over deze les
Door StudeliFout melden
Maak je eigen Studiemateriaal
Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.