1. Sammenligne objekter med==

Favorittfeilen til nybegynnerprogrammerere er å sammenligne objekter (spesielt strenger) ved å bruke 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 koden vil aldri vise "Strengene er like", fordi ifsetningen sammenligner referanser til to forskjellige strengobjekter.

Her er den riktige versjonen av 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. Endre et Stringobjekt

Nybegynnerprogrammerere glemmer ofte at alle objekter i klassen er uforanderlige , og at hver metode i Stringklassen returnerer et nytt objekt - det nåværende objektet endres aldri.

Eksempel:

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

Denne koden er veldig lik den riktige koden, men den vil ikke fungere som forventet. Metoden toUpperCase()endrer ikke objektet den kalles på. Riktig kode vil se slik ut:

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


3. Glemte å initialisere objekter som er elementer i en matrise

En annen vanlig feil er å glemme å initialisere en matrisevariabel. Eksempel:

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

Denne koden vil ikke fungere: du må eksplisitt sette matrisevariabelen lik en referanse til containerobjektet som skal lagre elementene i matrisen.

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


4. Bruke en lokal variabel i stedet for en forekomstvariabel.

Nybegynnere liker ikke å komme opp med lange og meningsfulle navn på variabler. De bruker ofte enkeltbokstavsnavn: a, b, i, osv. Det er en grusom ting å gjøre når koden har flere slike variabler:

Sett tallet 99 inn i 100 celler i en matrise
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;
    }
  }
}

Koden ovenfor vil ikke kompilere. Den riktige versjonen ser slik ut:

Sett tallet 99 inn i 100 celler i en matrise
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. Fjerne et samleobjekt

Svært ofte er det situasjoner når et bestemt element må fjernes fra en samling. Koden ser omtrent slik ut:

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 koden vil ikke fungere, fordi du ikke kan bruke en for-hver-løkke til å samtidig krysse elementene i en samling og endre den samlingen.

Det finnes flere løsninger. Først kan du gå gjennom en samling og endre en annen:

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 andre, siden Java 8, har samlinger en removeIf()metode som du kan sende en regel (lambda-funksjon) til som indikerer hvilke elementer som 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. Plassere flere klasser med publicmodifikatoren i en enkelt fil

Det kan bare være én offentlig klasse i en fil. Flere klasser kan deklareres i en fil, men de må enten være indre klasser av en offentlig klasse, eller ikke ha modifikatoren public. Eksempel:

Innholdet i Solution.java-filen Merk
public class Solution
{
}
public class Main
{
}
Dette er ikke tillatt: to offentlige klasser i en enkelt fil.
public class Solution
{
}
class Main
{
}
Men du kan gjøre dette. Hovedklassen er ikke offentlig
public class Solution
{
  public static class Main
  {
  }
}
Og du kan gjøre dette. Hovedklassen er en nestet klasse


7. Kalle vanlige (ikke-statiske) metoder for en klasse fra den statiske main()metoden

Noen ganger prøver nybegynnere programmerere å få tilgang til ikke-statiske variabler og metoder fra metoden main()eller andre statiske metoder. Slik kode vil selvfølgelig ikke fungere.

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. Vel, eller det må først opprette en forekomst av klassen Solution, og først deretter kalle ikke-statiske metoder for det objektet. 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 annen vanlig feil er feil deklarering av en klassekonstruktør. Navnet på en konstruktør må være det samme som navnet på klassen, og en konstruktør har ingen resultattype. De vanligste feilene ser slik ut:

public class Person
{
   private String value;

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




Det skal ikke være en returtype her
public class Person
{
   private String value;

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




Ugyldig konstruktørnavn. Navnet på konstruktøren må samsvare med klassenavnet
public class Person
{
   private String value;

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






this mangler. Variabelen valuevil bli tildelt seg selv
public class Person
{
   private String value;

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




Det er alt riktig


9. Feil nedarving av grensesnitt

Javas skapere prøvde å gjøre det veldig nært engelsk, så de valgte forskjellige nøkkelord for visse relaterte konsepter.

Når en klasse arver en klasse, må du bruke nøkkelordet extends:

class Pet
{
}

class Cat extends Pet
{
}

Når en klasse arver et grensesnitt, må du bruke nøkkelordet implements:

interface Meow
{
}

class Cat implements Meow
{
}

Når et grensesnitt arver et grensesnitt, bruk nøkkelordet extends:

interface Meow
{
}

interface Voice extends Meow
{
}


10. Utelatelse breaki en switchuttalelse

Og den siste feilen for oss i dag, men ikke den siste for nybegynnere, er å ikke inkludere en breakuttalelse i en switchuttalelse. Eksempel

Feil Ikke sant
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;
}