1. Jämföra objekt med==

Favoritfelet för nybörjarprogrammerare är att jämföra objekt (särskilt strängar) med ==operatören. Till exempel:

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

Den här koden kommer aldrig att visa "Strängarna är lika", eftersom satsen ifjämför referenser till två olika strängobjekt.

Här är den korrekta versionen 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. Ändra ett Stringobjekt

Nybörjarprogrammerare glömmer ofta att alla objekt i klassen är oföränderliga och att varje metod i Stringklassen returnerar ett nytt objekt - det aktuella objektet ändras aldrig.

Exempel:

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

Den här koden är väldigt lik den korrekta koden, men den kommer inte att fungera som förväntat. Metoden toUpperCase()ändrar inte objektet som den anropas på. Rätt kod skulle se ut så här:

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


3. Att glömma att initiera objekt som är element i en array

Ett annat vanligt misstag är att glömma att initiera en arrayvariabel. Exempel:

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

Den här koden fungerar inte: du måste uttryckligen ställa in arrayvariabeln lika med en referens till containerobjektet som kommer att lagra elementen i arrayen.

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


4. Använda en lokal variabel istället för en instansvariabel.

Nybörjare gillar inte att komma på långa och meningsfulla namn på variabler. De använder ofta enbokstavsnamn: a, b, i, etc. Det är en grym sak att göra när koden har flera sådana variabler:

Sätt siffran 99 i 100 celler i en 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;
    }
  }
}

Koden ovan kommer inte att kompileras. Den korrekta versionen ser ut så här:

Sätt siffran 99 i 100 celler i en 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. Ta bort ett samlingsobjekt

Mycket ofta finns det situationer när ett visst element måste tas bort från en samling. Koden ser ungefär ut så här:

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

Den här koden kommer inte att fungera, eftersom du inte kan använda en för varje slinga för att samtidigt gå igenom elementen i en samling och modifiera den samlingen.

Det finns flera lösningar. Först kan du gå igenom en samling och ändra en annan:

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

För det andra, sedan Java 8, har samlingar en removeIf()metod, till vilken du kan skicka en regel (lambda-funktion) som anger vilka element som ska tas bort.

Exempel:

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

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


6. Placera flera klasser med publicmodifieraren i en enda fil

Det kan bara finnas en offentlig klass i en fil. Fler klasser kan deklareras i en fil, men de måste antingen vara inre klasser av en offentlig klass eller inte ha modifieraren public. Exempel:

Innehållet i filen Solution.java Notera
public class Solution
{
}
public class Main
{
}
Detta är inte tillåtet: två offentliga klasser i en enda fil.
public class Solution
{
}
class Main
{
}
Men du kan göra det här. Huvudklassen är inte offentlig
public class Solution
{
  public static class Main
  {
  }
}
Och du kan göra detta. Huvudklassen är en kapslad klass


7. Anropa vanliga (icke-statiska) metoder för en klass från den statiska main()metoden

Ibland försöker nybörjarprogrammerare komma åt icke-statiska variabler och metoder från main()metoden eller andra statiska metoder. Sådan kod fungerar naturligtvis inte.

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

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

Huvudmetoden kan endast hänvisa till statiska metoder/variabler. Tja, eller så måste den först skapa en instans av klassen Solutionoch först sedan anropa icke-statiska metoder för det objektet. Exempel:

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. Deklarera en konstruktor som en metod

Ett annat vanligt misstag är att felaktigt deklarera en klasskonstruktor. Namnet på en konstruktor måste vara detsamma som namnet på klassen, och en konstruktor har ingen resultattyp. De vanligaste misstagen ser ut så här:

public class Person
{
   private String value;

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




Det borde inte finnas någon returtyp här
public class Person
{
   private String value;

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




Ogiltigt konstruktornamn. Namnet på konstruktören måste matcha klassnamnet
public class Person
{
   private String value;

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






this saknas. Variabeln valuekommer att tilldelas sig själv
public class Person
{
   private String value;

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




Det är allt korrekt


9. Felaktigt arv av gränssnitt

Javas skapare försökte göra det väldigt nära engelska, så de valde olika nyckelord för vissa relaterade begrepp.

När en klass ärver en klass måste du använda nyckelordet extends:

class Pet
{
}

class Cat extends Pet
{
}

När en klass ärver ett gränssnitt måste du använda nyckelordet implements:

interface Meow
{
}

class Cat implements Meow
{
}

När ett gränssnitt ärver ett gränssnitt, använd extendsnyckelordet:

interface Meow
{
}

interface Voice extends Meow
{
}


10. Utelämnande breaki ett switchuttalande

Och det sista misstaget för oss idag, men inte det sista för nybörjare, är att inte inkludera ett breakuttalande i ett switchuttalande. Exempel

Fel Höger
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;
}