1. Objecten vergelijken met==
De favoriete fout van beginnende programmeurs is het vergelijken van objecten (vooral strings) met behulp van de ==
operator. Bijvoorbeeld:
Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
System.out.println("The strings are equal");
}
Deze code zal nooit "The strings are equal" weergeven, omdat de if
instructie verwijzingen naar twee verschillende stringobjecten vergelijkt.
Hier is de juiste versie van de code:
Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1.equals(s2))
{
System.out.println("The strings are equal");
}
String
2. Een object wijzigen
Beginnende programmeurs vergeten vaak dat alle objecten van de klasse onveranderlijk zijn en dat elke methode van de String
klasse een nieuw object retourneert — het huidige object verandert nooit.
Voorbeeld:
String s = "Hello";
s.toUpperCase (); // Convert to uppercase
Deze code lijkt sterk op de juiste code, maar werkt niet zoals verwacht. De toUpperCase()
methode verandert het object waarop het wordt aangeroepen niet. De juiste code zou er als volgt uitzien:
String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase
3. Vergeten objecten te initialiseren die elementen van een array zijn
Een andere veelgemaakte fout is het vergeten een arrayvariabele te initialiseren. Voorbeeld:
int[] array;
array[0] = 1;
array[0] = 2;
Deze code werkt niet: u moet de arrayvariabele expliciet gelijk stellen aan een verwijzing naar het containerobject waarin de elementen van de array worden opgeslagen.
int[] array = new int[10];
array[0] = 1;
array[0] = 2;
4. Een lokale variabele gebruiken in plaats van een instantievariabele.
Nieuwkomers houden er niet van om lange en betekenisvolle namen voor variabelen te bedenken. Ze gebruiken vaak namen van één letter: a
, b
, i
, enz. Dat is wreed om te doen als de code meerdere van dergelijke variabelen heeft:
Zet het getal 99 in 100 cellen van een array |
---|
|
De bovenstaande code wordt niet gecompileerd. De juiste versie ziet er zo uit:
Zet het getal 99 in 100 cellen van een array |
---|
|
5. Een verzamelitem verwijderen
Heel vaak zijn er situaties waarin een bepaald element uit een verzameling moet worden verwijderd. De code ziet er ongeveer zo uit:
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);
for (Integer value: list)
if (value < 0)
list.remove(value);
Deze code werkt niet, omdat je geen for-each-lus kunt gebruiken om tegelijkertijd de elementen van een collectie te doorlopen en die collectie te wijzigen.
Er zijn verschillende oplossingen. Eerst kun je de ene verzameling doorlopen en een andere wijzigen:
Oplossing 1 |
---|
|
Ten tweede hebben verzamelingen sinds Java 8 een removeIf()
methode waaraan u een regel (lambda-functie) kunt doorgeven die aangeeft welke elementen moeten worden verwijderd.
Voorbeeld:
Oplossing 2 |
---|
|
6. Meerdere klassen met de public
modifier in één bestand plaatsen
Er kan slechts één openbare klasse in een bestand zijn. Er kunnen meer klassen in een bestand worden gedeclareerd, maar ze moeten of binnenklassen van een openbare klasse zijn of de public
modifier niet hebben. Voorbeeld:
Inhoud van het Solution.java-bestand | Opmerking |
---|---|
|
Dit mag niet: twee publieke klassen in één bestand. |
|
Maar je kunt dit doen. De hoofdklasse is niet openbaar |
|
En jij kunt dit. De klasse Main is een geneste klasse |
7. Gewone (niet-statische) methoden van een klasse aanroepen vanuit de statische main()
methode
Soms proberen beginnende programmeurs toegang te krijgen tot niet-statische variabelen en methoden van de main()
methode of andere statische methoden. Zo'n code werkt natuurlijk niet.
public class Solution
{
public int n = 100;
public int[] createArray()
{
return new int[n];
}
public static void main(String[]args)
{
int[] array = createArray();
}
}
De hoofdmethode kan alleen verwijzen naar statische methoden/variabelen. Welnu, of het moet eerst een instantie van de klasse maken Solution
en pas daarna niet-statische methoden van dat object aanroepen. Voorbeeld:
Oplossing 1 | Oplossing 2 |
---|---|
|
|
8. Een constructor declareren als een methode
Een andere veelgemaakte fout is het onjuist declareren van een klassenconstructor. De naam van een constructor moet gelijk zijn aan de naam van de klasse en een constructor heeft geen resultaattype. De meest voorkomende fouten zien er als volgt uit:
|
Er zou hier geen retourtype moeten zijn |
|
Ongeldige constructornaam. De naam van de constructor moet overeenkomen met de klassenaam |
|
this ontbreekt. De value variabele wordt aan zichzelf toegewezen |
|
Dat klopt allemaal |
9. Onjuiste overerving van interfaces
De makers van Java probeerden het heel dicht bij het Engels te brengen, dus kozen ze verschillende trefwoorden voor bepaalde verwante concepten.
Wanneer een klasse een klasse overerft, moet u het extends
trefwoord gebruiken:
class Pet
{
}
class Cat extends Pet
{
}
implements
Wanneer een klasse een interface erft, moet u het trefwoord gebruiken :
interface Meow
{
}
class Cat implements Meow
{
}
Wanneer een interface een interface overerft, gebruik dan het extends
trefwoord:
interface Meow
{
}
interface Voice extends Meow
{
}
10. Weglaten break
in een switch
verklaring
En de laatste fout voor ons vandaag, maar niet de laatste voor beginners, is het niet opnemen van een break
verklaring in een switch
verklaring. Voorbeeld
Fout | Rechts |
---|---|
|
|
GO TO FULL VERSION