1. Sammenligning af objekter med==

Den foretrukne fejl hos nybegyndere programmører er at sammenligne objekter (især strenge) ved hjælp af ==operatøren. For eksempel:

Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
   System.out.println("The strings are equal");
}

Denne kode vil aldrig vise "Strengene er ens", fordi sætningen ifsammenligner referencer til to forskellige strengobjekter.

Her er den korrekte version af koden:

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


2. Ændring af et Stringobjekt

Nybegyndere programmører glemmer ofte, at alle objekter i klassen er uforanderlige , og at hver metode i Stringklassen returnerer et nyt objekt - det aktuelle objekt ændres aldrig.

Eksempel:

String s = "Hello";
s.toUpperCase (); // Convert to uppercase

Denne kode minder meget om den korrekte kode, men den virker ikke som forventet. Metoden toUpperCase()ændrer ikke det objekt, den kaldes på. Den korrekte kode ville se sådan ud:

String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase


3. Glemmer at initialisere objekter, der er elementer i et array

En anden almindelig fejl er at glemme at initialisere en array-variabel. Eksempel:

int[] array;
array[0] = 1;
array[0] = 2;

Denne kode virker ikke: du skal udtrykkeligt indstille array-variablen lig med en reference til containerobjektet, der gemmer elementerne i arrayet.

int[] array = new int[10];
array[0] = 1;
array[0] = 2;


4. Brug af en lokal variabel i stedet for en instansvariabel.

Nybegyndere kan ikke lide at komme med lange og meningsfulde navne til variabler. De bruger ofte enkeltbogstavsnavne: a, b, i, osv. Det er en grusom ting at gøre, når koden har flere variabler som denne:

Indsæt tallet 99 i 100 celler i en matrix
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;
    }
  }
}

Ovenstående kode vil ikke kompilere. Den korrekte version ser således ud:

Indsæt tallet 99 i 100 celler i en matrix
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. Fjernelse af et samleobjekt

Meget ofte er der situationer, hvor et bestemt element skal fjernes fra en samling. Koden ser nogenlunde sådan ud:

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);

Denne kode virker ikke, fordi du ikke kan bruge en for-hver-løkke til samtidig at krydse elementerne i en samling og ændre den samling.

Der er flere løsninger. Først kan du gå gennem en samling og ændre en anden:

Løsning 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);

For det andet, siden Java 8, har samlinger en removeIf()metode, hvortil du kan sende en regel (lambda-funktion), der angiver, hvilke elementer der skal fjernes.

Eksempel:

Løsning 2
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

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


6. Placering af flere klasser med publicmodifikatoren i en enkelt fil

Der kan kun være én offentlig klasse i en fil. Flere klasser kan erklæres i en fil, men de skal enten være indre klasser af en offentlig klasse eller ikke have modifikatoren public. Eksempel:

Indholdet af filen Solution.java Bemærk
public class Solution
{
}
public class Main
{
}
Dette er ikke tilladt: to offentlige klasser i en enkelt fil.
public class Solution
{
}
class Main
{
}
Men du kan gøre dette. Hovedklassen er ikke offentlig
public class Solution
{
  public static class Main
  {
  }
}
Og du kan gøre dette. Hovedklassen er en indlejret klasse


7. Kaldning af almindelige (ikke-statiske) metoder i en klasse fra den statiske main()metode

Nogle gange forsøger nybegyndere programmører at få adgang til ikke-statiske variabler og metoder fra metoden main()eller andre statiske metoder. En sådan kode virker selvfølgelig ikke.

public class Solution
{
   public int n = 100;
   public int[] createArray()
   {
      return new int[n];
   }

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

Hovedmetoden kan kun referere til statiske metoder/variabler. Nå, eller det skal først oprette en forekomst af klassen Solutionog først derefter kalde ikke-statiske metoder for det objekt. Eksempel:

Løsning 1 Løsning 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. Erklære en konstruktør som en metode

En anden almindelig fejl er forkert at erklære en klassekonstruktør. Navnet på en konstruktør skal være det samme som navnet på klassen, og en konstruktør har ingen resultattype. De mest almindelige fejl ser sådan ud:

public class Person
{
   private String value;

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




Der burde ikke være en returtype her
public class Person
{
   private String value;

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




Ugyldigt konstruktørnavn. Navnet på konstruktøren skal matche klassenavnet
public class Person
{
   private String value;

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






this mangler. Variablen valuevil blive tildelt sig selv
public class Person
{
   private String value;

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




Det er alt sammen korrekt


9. Forkert nedarvning af grænseflader

Javas skabere forsøgte at gøre det meget tæt på engelsk, så de valgte forskellige søgeord for visse relaterede begreber.

Når en klasse arver en klasse, skal du bruge nøgleordet extends:

class Pet
{
}

class Cat extends Pet
{
}

Når en klasse arver en grænseflade, skal du bruge nøgleordet implements:

interface Meow
{
}

class Cat implements Meow
{
}

Når en grænseflade arver en grænseflade, skal du bruge nøgleordet extends:

interface Meow
{
}

interface Voice extends Meow
{
}


10. Udeladelse breaki en switchredegørelse

Og den sidste fejl for os i dag, men ikke den sidste for begyndere, er at undlade at inkludere en breakerklæring i en switcherklæring. Eksempel

Forkert Højre
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;
}