CodeGym /Java Course /All lectures for NL purposes /Populaire fouten gemaakt door beginnende programmeurs

Populaire fouten gemaakt door beginnende programmeurs

All lectures for NL purposes
Niveau 1 , Les 553
Beschikbaar

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 ifinstructie 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");
}


String2. Een object wijzigen

Beginnende programmeurs vergeten vaak dat alle objecten van de klasse onveranderlijk zijn en dat elke methode van de Stringklasse 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
class Solution
{
  public static int a = 99;
  public static int i = 100;

  public static void main(String[] args)
  {
    int[] a = new int[i];
    for (int i = 0; i < 10; i++)
    {
      a[i] = a;
    }
  }
}

De bovenstaande code wordt niet gecompileerd. De juiste versie ziet er zo uit:

Zet het getal 99 in 100 cellen van een array
class Solution
{
   public static int value = 99;
   public static int count = 100;

   public static void main(String[] args)
   {
      int[] a = new int[count];
      for (int i = 0; i < count; i++)
      {
         a[i] = value;
      }
   }
}


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
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

ArrayList<Integer> copy = new ArrayList<Integer>(list);
for (Integer value: copy)
   if (value < 0)
      list.remove(value);

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
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

list.removeIf( x-> x<0 );


6. Meerdere klassen met de publicmodifier 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 publicmodifier niet hebben. Voorbeeld:

Inhoud van het Solution.java-bestand Opmerking
public class Solution
{
}
public class Main
{
}
Dit mag niet: twee publieke klassen in één bestand.
public class Solution
{
}
class Main
{
}
Maar je kunt dit doen. De hoofdklasse is niet openbaar
public class Solution
{
  public static class Main
  {
  }
}
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 Solutionen pas daarna niet-statische methoden van dat object aanroepen. Voorbeeld:

Oplossing 1 Oplossing 2
public class Solution
{
  public static int n = 100;

  public static int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    int[] array = createArray();
  }
}
public class Solution
{
  public int n = 100;

  public int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    Solution sol = new Solution();
    int[] array = sol.createArray();
  }
}


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:

public class Person
{
   private String value;

   void Person(String value)
   {
      this.value = value;
   }
}




Er zou hier geen retourtype moeten zijn
public class Person
{
   private String value;

   constructor(String value)
   {
      this.value = value;
   }
}




Ongeldige constructornaam. De naam van de constructor moet overeenkomen met de klassenaam
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}






this ontbreekt. De valuevariabele wordt aan zichzelf toegewezen
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}




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 extendstrefwoord gebruiken:

class Pet
{
}

class Cat extends Pet
{
}

implementsWanneer 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 extendstrefwoord:

interface Meow
{
}

interface Voice extends Meow
{
}


10. Weglaten breakin een switchverklaring

En de laatste fout voor ons vandaag, maar niet de laatste voor beginners, is het niet opnemen van een breakverklaring in een switchverklaring. Voorbeeld

Fout Rechts
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
   case TUESDAY:
      System.out.println("Tuesday");
   case WEDNESDAY:
      System.out.println("Wednesday");
   case THURSDAY:
      System.out.println("Thursday");
   case FRIDAY:
      System.out.println("Friday");
   case SATURDAY:
      System.out.println("Saturday");
   case SUNDAY:
      System.out.println("Sunday");
}
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
      break;
   case TUESDAY:
      System.out.println("Tuesday");
      break;
   case WEDNESDAY:
      System.out.println("Wednesday");
      break;
   case THURSDAY:
      System.out.println("Thursday");
      break;
   case FRIDAY:
      System.out.println("Friday");
      break;
   case SATURDAY:
      System.out.println("Saturday");
      break;
   case SUNDAY:
      System.out.println("Sunday");
      break;
}

Opmerkingen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION