Programming Blok 1
In dit document worden alle onderwerpen die zijn besproken per week samengevat. Dit is een handig naslagwerk om je kennis te controleren of weer even op te frissen!
LET OP: Je mag deze pagina niet bij het tentamen gebruiken!
Week 1
Een project aanmaken in IntelliJ IDEA
Om een nieuw project in IntelliJ IDEA aan te maken kies je voor "File > New Project" en dan "Java". Klik geen extra frameworks aan en druk op tweemaal op "Next". Vul een naam voor je project in en klaar! Je plaatst je Java-bestanden vervolgens onder de "src"-map.
LET OP: De naam van een class altijd met een hoofdletter en gelijk aan de bestandsnaam!
TIP: Volgens de officiële Java-conventie hoort code thuis in een unieke package. Als je daaraan wilt voeldoen, raden wij een je Main-class als volgt aan te maken: nl.hva.gebruikersnaam.projectnaam.Main
Schoon als eerste stap altijd je Main-class op! Haal de standaard license op de eerste paar regels weg, het regeltje commentaar in de main-method, zorg ervoor dat de @author jouw volledige naam heeft, en zet gelijk de beschrijving van de te maken applicatie daarboven. Je krijgt dan zoiets als dit:
package nl.hva.fonlc.CheatsheetExample;
/**
* This application will summarize all topics that have been discussed in the
* Programming course.
*
* @author Lennard Fonteijn
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
}
}
De main-method in bovenstaande code is het startpunt van de applicatie.
TIP: Druk regelmatig op ALT + SHIFT + F (of COMMAND + SHIFT + F op Mac) om je code netjes uit te lijnen. Je kan ook rechtsklikken in Netbeans en dan kiezen voor Format.
println en print
Met println en print kan je String-waarde naar de console-output schrijven. Voor gebruik van de printf-variant, kijk dan naar Week 4 > Printf in dit document.
Code:
System.out.println("A string with line-ending");
System.out.print("A string without a line-ending");
System.out.print("A string with a manual line-ending\r\n");
System.out.println("Another \"string\" with quotes");
System.out.println("\tThis string is on a new line and starts with a Tab.");
Output:
A string with line-ending
A string without a line-endingA string with a manual line-ending
Another "string" with quotes
This string is on a new line and starts with a Tab.
TIP: Type 'sout' gevolgd door een CTRL+Spatie en Enter in Netbeans om snel een println regel op de plek van cursor te plaatsen.
Week 2
Variables en Datatypes
Een programma kan vrij weinig als je geen geheugen kan reserveren om data in op te slaan. Hiervoor heb je variables tot je beschikking. In combinatie met een datatype vraag jij aan Java om een stukje geheugen te reserveren met een bepaalde naam.
Hieronder volgt een voorbeeld met alle datatypes die Java standaard aan je geeft, hoe je ze gebruikt, hoeveel geheugen ze reserven en waar nodig de minimale en maximale waarde. Hierbij is het formaat als volgt:
DataType variableName = value;
Code:
String text = "A string";
//1 byte | Can cast to byte
char character = 'A';
//1 byte | Can cast to char | Min: -127 | Max: 127
byte aByte = -101;
//2 bytes | Min: -32.768 | Max: 32.767
short aShort = 1337;
//4 bytes | Min: -2^31 | Max: 2^(32-1)
int numberWithoutDecimals = 101;
//8 bytes | Min: -2^63 | Max: 2^(63-1)
long anotherNumberWithoutDecimals = 1337;
//4 bytes | Less precision than double
float numberWithDecimals = 1.5f;
//8 bytes | More precision than float
double anotherNumberWithDecimals = 1.5;
//true or false
boolean trueOrFalse = true;
LET OP: Volgens de HBO ICT conventie moeten variables een naam hebben in het CamelCase-formaat! Dit houdt in dat de naam altijd met een kleine letter begint en elk volgend woord een hoofdletter krijgt.
int of long
Wanneer gebruik je welke? In de regel pak je altijd een int tenzij je zeker weet dat invoer niet in de minimale of maximale waarde past!
double of float
Ook hier is de eeuwige vraag: wanneer gebruik je welke? Het antwoord hangt heel erg af waar je ze voor wil gebruiken en aan wie je het vraagt.
In de voorbeelden in de rest van dit document zullen we voor het gemak gebruik maken van doubles, ook omdat de Math-library van Java hier gebruik van maakt.
LET OP: Welke van de twee je ook kiest, wees consistent in het gebruik! Begin je met een double in je berekening, reken dan door met doubles. Ga niet tussentijds niet terug naar een float om deze later weer in een double te veranderen, want dan raak je precisie achter de komma kwijt.
Constants
Variables kunnen ook als constante worden aangemerkt. Een constante krijgt bij het aanmaken direct een waarde, waarna deze niet meer te veranderen is. Op constanten is een andere conventie qua naamgeving van toepassing dan CamelCase, namelijk CAPS + Underscores.
Code:
final int TEST_VARIABLE = 1337;
final String A_CONSTANT_STRING = "l33t";
TIP: Constanten kunnen zowel binnen als buiten methods aangemaakt worden. Dit is handig als je een constante op meer plekken dan enkel je main-method nodig hebt.
Scanner
Met een Scanner kun je gebruikersinvoer in de console uitlezen van een bepaald datatype. Voordat je een scanner kan gebruiken moet je het pakket importeren boven in je code.
Code Example 1:
package nl.hva.
import java.util.Scanner;
...
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
Een scanner hoef je in principe maar 1x aan te maken. Daarna kan je hem zo vaak als je wilt blijven gebruiken. Gebruik in plaats van nextLine ook andere methods zoals nextInt, als je bijvoorbeeld een heel getal als invoer wil hebben. Gebruik een nextFloat of een nextDouble al je een komma-getal als invoer wil hebben.
Code Example 2:
System.out.print("Please enter a number between 1 and 10: ")
double input = scanner.nextDouble();
TIP: Je kan bovenstaande code combineren met een do-while-loop van Week 4, om net zo lang om invoer te blijven vragen totdat deze correct is.
Arithmetic Operators
Arithmetic operators, ookwel gewoon operators genoemd, kunnen worden gebruikt om met de data die opgeslagen zit in variables te spelen. Denk aan variables bij elkaar optellen en het resultaat opslaan, maar ook twee strings samenvoegen.
Code:
int a = 101;
int b = 1337;
int resultAdd = a + b;
int resultSubtract = a - b;
int resultMultiply = a * b;
int resultDivide = a / b;
int resultModulo = a % b;
Result:
resultAdd => 1438
resultSubtract => -1236
resultMultiply => 135037
resultDivide => 0
resultModulo => 101
HERINNERING: Modulo bekijkt hoe vaak 'b' in zijn geheel in 'a' past. Het resultaat is hoeveel er overblijft. In bovenstaand voorbeeld past 1337 geen enkele keer in 101, dus blijft er 101 over.
Opvallend in het resultaat hierboven is de 0 van resultDivide. Dit komt omdat een integer geen komma-getal is! 101 / 1337 is ongeveer 0.076, maar door de int worden de decimalen weggeknipt, dus hou je een 0 over. Er wordt dus ook niet afgerond! Een deel van de oplossing is om de int in een float of double te veranderen, maar zelfs dan hou je een 0.0 over!
Dit tweede probleem wordt veroorzaakt omdat je twee integers door elkaar deelt, het antwoord daarvan is altijd zonder decimalen, zelfs je een float of double wil overhouden. De oplossing hiervoor is dat je één van de twee integers naar een float of double moet casten:
double resultDivide = a / (double)b;
LET OP: Het is in Java niet mogelijk een getal te delen door nul (0), je krijgt dan een DivideByZeroException.
Assignment Operators
Buiten arithmetic operators, heb je ook nog assignment operators. Deze doen precies wat de naam zegt dat ze doen: Ze voeren zowel een operator uit als de toewijzing van het resultaat aan een variable.
Code:
a += b; //Equivalent: a = a + b;
a -= b; //Equivalent: a = a - b;
a *= b; //Equivalent: a = a +* b;
Unary Operators
Als laatste zijn er nog de unary operators, oftewel: éénzijdige operators. Ze hebben geen twee waardes nodig om te werken, in tegenstelling tot normal operators waarbij je een linkerkant en rechtkant hebt.
int a = 1337;
a++; //Increment | Equivalent: a = a + 1;
a--; //Decrement | Equivalent: a = a - 1;
int result = 101;
result = a++; //Assign 'a' to 'result', then increment 'a'.
result = ++a; //Increment 'a', then assign 'a' to 'result'.
result = a--; //Assign 'a' to 'result', then decrement 'a'.
result = --a; //Decrement 'a', then assign 'a' to 'result'.
result = -a; //Negate 'a', negative becomes positive, positive becomes negative.
boolean b = false;
boolean boolResult = !b; //Negate 'b', false becomes true, true becomes false
LET OP: De volgorde van de increment en decrement is dus belangrijk bij het toewijzen aan een variable!
Week 3
Logical Operators
Nog een soort operators zijn de logical operators, ook wel conditional operators genoemd. Deze worden gebruikt in combinatie met booleans om uiteindelijk tot een true of false te komen.
Code:
boolean a = false;
boolean b = true;
boolean test;
test = a || b;
test = a && b;
test = !a && b;
test = a || (!a && b);
Result:
false || true
=> true
false && true
=> false
!false && true
=> true && true
=> true
false || (!false && true)
=> false || (true && true)
=> false || true
=> true
Equality Operators
De laatste type operators zijn de equality operators. Deze worden gebruikt om een linker- en rechterkant met elkaar te vergelijken, en daar uiteindelijk een boolean uit af te lijden.
Code:
int a = 1337;
int b = 101;
boolean result;
result = (a == b);
result = (a < b);
result = (a <= b);
result = (a > b);
result = (a >= b);
result = (a != b); //!= means "is not equal to"
Result:
a == b
=> 1337 == 101
=> false
a < b
=> 1337 < 101
=> false
a <= b
=> 1337 < 101
=> false
a > b
=> 1337 > 101
=> true
a >= b
=> 1337 >= 101
=> true
a != b
=> 1337 != 101
=> true
LET OP: Als je twee strings met elkaar wil vergelijken, dan werkt == niet! Je moet hiervoor dan de equals-method gebruiken als volgt: stringA.equals(stringB).
If en Else
Met een if-statement kun je in code laten uitvoeren als een bepaalde conditie waar is. Een conditie bestaat in ieder geval uit één boolean (al dan niet als resultaat van een equality operator), of meerdere booleans die door middel van conditionel operators aan elkaar zijn geknoopt. Indien de conditie niet waar is, kan je terugvallen op een alternatief stukje code met een else, maar dit is optioneel.
Code:
int a = 1337;
int b = 101;
if(a >= b || a < 100) {
System.out.println("a is bigger than or equal to b OR a is smaller than 100!");
} else {
System.out.println("a is not bigger than or equal to b AND a is also not smaller than 100!");
}
Output:
a is bigger than or equal to b OR a is smaller than 100!
Else If
Het is ook mogelijk om meerdere if-condities te hebben in één enkele if-else constructie, hiervoor gebruik je een else if-statement.
Code:
int a = 1337;
int b = 101;
if (a >= b) {
System.out.println("a is bigger than or equal to b!");
} else if (a < 100) {
System.out.println("a is smaller than 100!");
} else {
System.out.println("a is not bigger than or equal to b AND a is also not smaller than 100!");
}
Output:
a is bigger than or equal to b!
LET OP: Condities worden van boven naar beneden gechecked in één enkele if-else constructie. Java zal de code uitvoeren van de conditie die als eerste waar is en de rest overslaan. Als dit niet is wat je wilt, moet je losse if-statements gebruiken.
If-Else shorthand
Er is een kortere notatie om op basis van een conditie een waarde toe te wijzen aan een variable, hiervoor kun je de ?:-statement gebruiken. Het formaat is als volgt:
variable = conditie ? if : else
Code:
int a = 100;
String result = (a < 100) ? "Yes :D" : "No D:";
Result:
result
=> No D:
Switch
In plaats van een gigantische lap code bij heel veel if else-statements, is het over het algemeen netter om een switch statement te gebruiken. Dit kan echter alleen als de conditie een == is, het werkt niet voor <= < >= > !=. Dit werkt ook voor strings.
Code:
int a = 1337;
switch(a) {
case 0: //Equivalent: if(a == 0)
System.out.println("a is 0");
break;
case 101: //Equivalent: else if(a == 101)
System.out.println("a is 101");
break;
case 1337: //Equivalent: else if(a == 1337)
System.out.println("a is 1337");
break;
default: //Equivalent: else
System.out.println("a is not 0, 101 or 1337");
break;
}
Output:
a is 1337
LET OP: Als je geen break neerzet, zal Java net zo lang code binnen de switch-blijven uitvoeren totdat deze een break tegenkomt of bij het einde van de switch komt.
Math-class
De statische Math-class heeft een aantal zeer handige functies waar je gebruik van kan maken. Buiten round welke je kan gebruiken om een kommagetal netjes af te ronden, heb je ook pow voor machten, sqrt voor worteltrekken, min en max om van twee waardes de kleine of grootste te te pakken, enzovoorts.
Code:
int result;
result = Math.min(0, 100);
result = Math.max(0, 100);
result = Math.max(0, Math.min(50, 100)); //Clamp value between min and max
double resultDecimals;
resultDecimals = Math.round(Math.PI);
resultDecimals = Math.round(Math.PI * 100) / 100;
Result:
result => 0
result => 100
result => 50
resultDecimals => 3.0
resultDecimals => 3.14
TIP: Door je waarde eerst te vermenigvuldigen met een x aantal tientallen, kan je met round gericht afronden tot x decimalen. 10 is 1 decimal, 100 is 2 decimalen, 1000 is 3 decimalen, enzovoorts.
Week 4
Printf
In Week 1 is println en print geintroduceerd, maar buiten deze twee is er nog een veel krachtigere variant, namelijk de printf. Stel je hebt een string die je moet combineren met 3 integers, dat is een hoop gedoe met +jes en quotes. Met de printf kan je datzelfde doen door middel van speciale characters in je string en later aangeven wat ervoor in de plaats moet komen.
Java heeft de volgende speciale characters tot zijn beschikking:
%svoor eenString%dvoor eenint%fvoorfloatofdouble%nvoor een nieuwe regel
Verder heb je hier nog een aantal variaties op:
%-20.20som eenStringvan maximaal 20 characters links uit te lijnen%20.20som eenStringvan maximaal 20 characters rechts uit te lijnen%.2fom eenfloatofdoublemet 2 decimalen af te drukken
Code:
String name = "Programming";
int weeks = 6;
float a = 1.01f;
double b = 1.337;
System.out.printf("The course %s is awesome!%n", name);
System.out.printf("We've had %d weeks of lectures, and learned that %f is a float and %.2f a double!%n", weeks, a, b);
Output:
The course Programming is awesome!
We've had 6 weeks of lectures, and learned that 1.010000 is a float and 1.34 a double!
While
Met een while-loop kan je op basis van een conditie code blijven uitvoeren zolang de conditie true blijft. Wordt de conditie false of gebruik je een break, dan gaat Java verder met de code wat na de while-loop komt.
Code Example 1:
boolean done = false;
int i = 0;
while(!done) { //Equivalent: done != false
System.out.println("We're not done yet...");
if(++i > 10) { //Equivalent: i = i + 1; if(i > 10)
System.out.println("Psych! We're done afterall...");
done = true;
}
}
In dit voorbeeld blijft de while net zolang doorgaan totdat done op true gezet wordt. Dit gebeurt pas nadat i groter is dan 10.
HERINNERING: Door de ++ voor de i te zetten, gaat i eerst 1 omhoog en wordt dan pas gechecked op groter dan 10. Hierdoor zal "We're note done yet..." 11 keer worden geprint. Wanneer de ++ achter de i wordt gezet, zal "We're note done yet.." 12 keer worden geprint.
Code Example 2:
int i = 0;
while(true) {
System.out.println("We're not done yet...");
if(++i > 10) { //Equivalent: i = i + 1; if(i > 10)
System.out.println("Psych! We're done afterall...");
break;
}
}
Dit voorbeeld is hetzelfde als Code Example 1, maar dan met gebruik van een break. Door de while(true) zal deze code oneindig herhalen, totdat break aangeroepen wordt. Dit is enkel om het gebruik van break te laten zien. Verkies altijd een goede conditie boven een oneindige loop!
LET OP: Door een break zal een while-loop in één keer stoppen! Heb je na een break nog code staan, dan wordt dit niet meer uitgevoerd.
Do-While
Naast de while-loop, bestaat er ook nog de do-while-loop. In tegenstelling tot de while-loop waarbij de code binnenin afhankelijk van de conditie mogelijk nooit wordt uitgevoerd, wordt de code binnen een do-while-loop wel minimaal 1x wordt uitgevoerd. Dit komt omdat de conditie-check pas aan het einde van de loop plaatsvind en niet aan het begin.
Code Example 1:
boolean condition = false;
while (condition) {
System.out.println("I'll never be executed :(");
}
do {
System.out.println("I'm executed at least once :)");
} while (condition);
Output:
I'm executed at least once :)
Zoals vermeld bij de Scanner van Week 2, kan een do-while-loop ook gebruiken om met zolang om invoer te vragen totdat deze correct is.
Code Example 2:
do {
System.out.print("Please enter a number between 1 and 10: ")
double input = scanner.nextDouble();
} while(input < 1 || input > 10);
For
Als laatste soort loop hebben we nog de for-loop. Dit is een speciale constructie die 3 dingen voor je kan doen:
- Tijdelijke variables aanmaken voor gebruik binnen de
for-loop. - Checken of de opgegeven conditie nog
trueis en zoja, de code binnenin nog een keer uitvoeren. - Nadat de code binnenin is uitgevoerd, één of meerdere variables aanpassen met een assignment operator of unary operator.
Het formaat met het lijstje van hierboven ziet er dan als volgt uit:
for(1; 2; 3)
Overigens zijn 1 en 3 optioneel, zolang je wel de ; neerzet.
Code:
for(int i = 0; i < 5; i++) {
System.out.printf("I am at index %d out of 5!%n", i + 1);
}
Equivalent Code:
int i = 0
for(;i < 5;) { //Equivalent: while(i < 5)
System.out.printf("I am at index %d out of 5!%n", i + 1);
i++;
}
Output:
I am at index 1 out of 5!
I am at index 2 out of 5!
I am at index 3 out of 5!
I am at index 4 out of 5!
I am at index 5 out of 5!
Week 5
Methods
Tot nu toe heb je alles binnen de main-method gedaan. Dit is prima voor kleine applicaties, maar het wordt al gauw onoverzichtelijk. Gelukkig is hier een oplossing voor: methodes!
Methodes zijn vergelijkbaar met een wiskunde-som als c = 2a + b. Je stopt er a en b in, en je krijgt c als resultaat. Stel dat je deze wiskunde-som in code wil uitdrukken, dan ziet dat er in Java zo uit:
Code Example 1:
public static int myMathFunction(int a, int b) {
return (2 * a) + b;
}
Vanuit je main-method, roep je deze dan als volgt aan:
int a = 1337;
int b = 101;
int c = myMathFunction(a, b);
System.out.printf("The result is %d%n", c);
Output:
The result is 2775
Je mag op elke gewenst moment methodes maken en aanroepen. Methodes hoeven niet eens een waarde terug te geven! Het volgende is ook mogelijk:
Code Example 2:
public static void printScore(String name, int score) {
System.out.printf("%s scored %d points%n", name, score);
}
Hierin geeft de void aan dat deze methode niks teruggeeft. Vanuit je main-method roepen je deze dan als volgt aan:
String playerName = "Peter";
int playerScore = 1337;
printScore(playerName, playerScore);
Output:
Peter scored 1337 points
LET OP: Het maakt voor een methode niet uit waar een variable vandaan komt of hoe deze origineel heette. Vandaar dat in het voorbeeld hierboven playerName in de methode als name wordt gebruikt.
Als je een waarde in een methode aanpast, heeft dit geen effect op de waarde van de originele variabele.
Code Example 3:
public static void main(String[] args) {
int number = 2;
System.out.printf("[main] The number is %d%n", number);
multiplyNumber(number);
System.out.printf("[main] The number is %d%n", number);
}
public static void multiplyNumber(int a) {
a *= 2;
System.out.printf("[multiplyNumber] The number is %d%n", a);
}
Output:
[main] The number is 2
[multiplyNumber] The number is 4
[main] The number is 2
Als dit wel de bedoeling is, moet ervoor zorgen dat multiplyNumber de nieuwe waarde teruggeeft.
Code Example 4:
public static void main(String[] args) {
int number = 2;
System.out.printf("[main] The number is %d%n", number);
number = multiplyNumber(number);
System.out.printf("[main] The number is %d%n", number);
}
public static int multiplyNumber(int a) {
a *= 2;
System.out.printf("[multiplyNumber] The number is %d%n", a);
return a;
}
Output:
[main] The number is 2
[multiplyNumber] The number is 4
[main] The number is 4
Overloading
In de voorbeelden hierboven noemen we het myMathFunction(int a, int b) en printScore(String name, int score) deel van de declaratie van een methode een signature. De signature bestaat uit de naam van de methode en een lijst van argumenten.
In Java is het toegestaan methodes met dezelfde naam te hebben, zolang de argumenten verschillen. Dit noemen we overloading. De volgende overloaded methods zijn allemaal geldig:
public static void printScore(String name)
public static int printScore(String name, int score)
public static void printScore(int score, String name)
public static int printScore(int round, String name, int score)
LET OP: De return-waarde van een method, bijvoorbeeld int of void, telt dus niet mee bij overloading omdat dit geen onderdeel is van de signature!
Week 6
Arrays
In Week 2 > Variables en Datatypes is uitgelegd hoe je een stukje geheugen kan reserveren voor één stukje informatie. Wil je meer meer dan één stukje informatie opslaan, dan heb je meer variables nodig, maar dit is niet altijd handig. In plaats daarvan kun je ook gebruik maken van arrays. Een array is een stukje geheugen met één naam, maar waar je meerdere stukjes informatie in kwijt kan. Om een array te defineren gebruik je het volgende formaat:
Datatype[] variableName = new Datatype[length];
Bij een array moet je op een aantal dingen letten:
- De lengte van een array kan nadat deze eenmaal is gespecificeerd niet meer veranderen.
- Bij arrays spreken we over een index als we het over de plek in een array hebben.
- De eerste index begint altijd bij nul (
0), de laatste index islengte - 1. - Om een de waarde op een index op te halen of te wijzigen, maken we gebruik van blokhaken (
[]).
Code Example 1:
String[] stringArray = new String[4];
stringArray[0] = "An";
stringArray[1] = "Array";
stringArray[2] = "of";
stringArray[3] = "String";
System.out.println(stringArray[0]);
System.out.println(stringArray[1]);
System.out.println(stringArray[2]);
System.out.println(stringArray[3]);
Output:
An
Array
of
String
LET OP: Als je een waarde probeert op te halen of te wijzigen op een index bij buiten het bereik van de array valt, dan gooit Java een IndexOutOfBoundsException!
In plaats van met blokhaken waardes in de array stoppen, kun je dit ook doen bij het aanmaken. Bovenstaande code is ook als volgt te noteren:
Code Example 2:
String[] stringArray = new String[]{
"An",
"Array",
"of",
"String"
};
TIP: Ongeacht hoe je een array aanmaakt kun je altijd op basis van een index de gegevens ophalen of wijzigen.
Arrays zijn overigens prima te combineren met een for-loop uit Week 4 > For! Wil je bijvoorbeeld alle strings uit bovenstaande array printen naar de console, maar niet 4 keer een println gebruiken, dan kan dat!
Code Example 3:
for(int i = 0; i < stringArray.length; i++) {
System.out.println(stringArray[i]);
}
TIP: In Week 5 > Methods heb je geleerd over methodes. Deze kan je ook gebruiken in combinatie met arrays!
Code Example 4:
public static void printScores(String names[], int[] scores) {
for(int i = 0; i < names.length; i++) {
System.out.printf("%s scored %d points%n", names[i], scores[i]);
}
}
LET OP: In Week 5 > Methods heb je ook geleerd dat waardes in een methode aanpassen geen effect heeft op de originele variabele. Arrays zijn een uitzondering op deze regel. Als je de index van een array aanpast in een methode, heeft dat effect op de waarde in de originele array!
Multidimensional Arrays
Buiten arrays met maar één dimensie zoals in de paragraaf hiervoor, is het in Java ook mogelijk om meerdere dimensies aan een array toe te voegen, het gevolg daarvan is dat je een array in een array krijgt om bijvoorbeeld een tabel te representeren met rijen en kolommen. Het formaat van een multidimensional array is niet veel anders dan een normale array:
Datatype[][] variableName = new Datatype[length][length2];
TIP: Je kan nog meer dimensies toevoegen door nog een extra blokhaak toe te voegen aan de definitie!
Example Code 1:
String[][] stringArray = new String[3][];
stringArray[0] = new String[4];
stringArray[0][0] = "An";
stringArray[0][1] = "Array";
stringArray[0][2] = "of";
stringArray[0][3] = "String";
stringArray[1] = new String[2];
stringArray[1][0] = "Another";
stringArray[1][1] = "Array";
stringArray[2] = new String[1];
stringArray[2][0] = "Again";
Equivalent Code 1:
String[][] stringArray = new String[3][];
stringArray[0] = new String[]{
"An", "Array", "of", "String"
};
stringArray[1] = new String[]{
"Another", "Array"
};
stringArray[2] = new String[]{
"Again"
};
Equivalent Code 2:
String[][] stringArray = new String[][]{
{ "An", "Array", "of", "String" },
{ "Another", "Array" },
{ "Again" }
};
Om een multidimensionele array te printen naar de console met een for-loop kun je de volgende code gebruiken:
Example Code 2:
for (int row = 0; row < stringArray.length; row++) {
for (int column = 0; column < stringArray[row].length; column++) {
System.out.println(stringArray[row][column]);
}
}
Output:
An
Array
of
String
Another
Array
Again
TIP: Een multidimensionele array werkt van buiten naar binnen toe. Als je een array met 2 dimensies hebt, dan is de eerste dimensie dus de rij en de tweede dimensie de kolom.
Random-class
De Random-class van Java is heel handig om willekeurige getalen mee te generen. Je gebruikt deze net als de Scanner-class:
Random random = new Random();
Als je eenmaal een random-variable hebt, kun je methodes aanroepen als nextInt(10) om een een willekeurig getal tussen 0 en 10 te genereren. Maar er zijn nog vele anderen die je kan gebruiken!
LET OP: Random genereert getallen vanaf 0 tot de maximale waarde die je meegeeft, niet tot en met! Wil je dus een getal tussen de 1 en 10, waarbij 10 ook mogelijk is, dan moet je var result = random.nextInt(10) + 1; doen.
Foutmeldingen
Foutmeldingen zijn altijd vervelend, zeker als je niet in één oogopslag kan zien wat er mis is. Hieronder volgen een aantal handige tips om snel achter de boosdoener te komen.
Run Anyway
Wanneer Netbeans jouw deze keus aanbied, heb je al een fout in de syntax van je code zitten. Het indrukken van "Run Anyway" gaat niks magisch doen en zorgt zeer waarschijnlijk voor een hele zooi exceptions in je console output. Druk in plaats daarvan op "Cancel" en ga op zoek waar de fout zit, vaak al te herkennen aan rode kringels of rode uitroeptekens in de zijkant.
Imports vergeten
Wanneer je een class als Scanner of Exception als datatype wil gebruiken, moet je Java vertellen waar hij deze kan vinden door middel van een import. Zie Week 2 > Scanner in dit document hoe dat werkt. Vaak zal Netbeans je al proberen te helpen, klik daarvoor op het gele lichtbolletje in de zijkant, indien dat aanwezig is.
Typefouten
Veel gemaakte typefouten zijn de vergeten ; een paar regels voor de daadwerkelijke foutmelding waar Netbeans over zeurt.
Of dat je hebt een character geopend in de syntax, maar niet correct afgesloten. Denk daarbij aan de characters ( [ { " '. De regel in Java is dat als je tijdens het programmeren één van deze characters gebruikt, je ze ook weer moet afsluiten met ) ] } " '. Als je met Netbeans één van deze characters selecteert zullen beide geel oplichten.
TIP: Deze afsluit-regel geld uiteraard niet als je ze in een string gebruikt, maar voor de quotes om de string zelf heen weer wel.
Een andere veelgemaakte fout is dat er wordt vergeten dat Java hoofdletter-gevoelig is. Een variable met de naam number is niet hetzelfde als Number of nUmber.
Scope
Mocht al het bovenstaande niet helpen en heb je nog steeds rode kringels, dan is het goed mogelijk dat scope je aan het plagen is. Met scope bedoelen wij dat alle variables die binnen een block van {} worden aangemaakt, daarbuiten niet beschikbaar zijn.
Wrong Code:
int a = 1337;
int b = 101;
if (a >= b) {
String result = "a is bigger than or equal to b!";
} else if (a < 100) {
String result = "a is smaller than 100!";
} else {
String result = "a is not bigger than or equal to b AND a is also not smaller than 100!";
}
System.out.println(result);
Wat gebeurd hier?
- Binnen de
if-elsemaak je afhankelijk van de conditie eenresultaan en geef je deze een waarde. - Buiten de
if-elseprobeer jeresultvervolgens te printen.
Java vind punt 1 prima, maar zal minder blij zijn met punt 2. Dit komt omdat je variabele probeert te benaderen die binnen de {} van de if-else is aangemaakt.
Gelukkig is de oplossing hiervoor simpel: zet de definitie van result buiten de if-else!
Good Code:
int a = 1337;
int b = 101;
String result;
if (a >= b) {
result = "a is bigger than or equal to b!";
} else if (a < 100) {
result = "a is smaller than 100!";
} else {
result = "a is not bigger than or equal to b AND a is also not smaller than 100!";
}
System.out.println(result);