1. Vergleichen von Objekten mit==

Der Lieblingsfehler von Programmieranfängern ist der Vergleich von Objekten (insbesondere Strings) mithilfe des ==Operators. Zum Beispiel:

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

In diesem Code wird niemals „Die Zeichenfolgen sind gleich“ angezeigt, da die ifAnweisung Verweise auf zwei verschiedene Zeichenfolgenobjekte vergleicht.

Hier ist die korrekte Version des Codes:

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. Ein Objekt ändern

Neue Programmierer vergessen oft, dass alle Objekte der Klasse unveränderlich sind und dass jede Methode der StringKlasse ein neues Objekt zurückgibt – das aktuelle Objekt ändert sich nie.

Beispiel:

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

Dieser Code ist dem richtigen Code sehr ähnlich, funktioniert jedoch nicht wie erwartet. Die toUpperCase()Methode ändert nicht das Objekt, für das sie aufgerufen wird. Der richtige Code würde so aussehen:

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


3. Vergessen, Objekte zu initialisieren, die Elemente eines Arrays sind

Ein weiterer häufiger Fehler besteht darin, zu vergessen, eine Array-Variable zu initialisieren. Beispiel:

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

Dieser Code funktioniert nicht: Sie müssen die Array-Variable explizit auf einen Verweis auf das Containerobjekt setzen, das die Elemente des Arrays speichert.

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


4. Verwendung einer lokalen Variablen anstelle einer Instanzvariablen.

Neulinge erfinden nicht gerne lange und aussagekräftige Namen für Variablen. Sie verwenden häufig Namen, die nur aus einem Buchstaben bestehen: a, b, iusw. Das ist grausam, wenn der Code mehrere Variablen wie diese enthält:

Tragen Sie die Zahl 99 in 100 Zellen eines Arrays ein
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;
    }
  }
}

Der obige Code lässt sich nicht kompilieren. Die richtige Version sieht so aus:

Tragen Sie die Zahl 99 in 100 Zellen eines Arrays ein
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. Entfernen eines Sammlungsgegenstandes

Sehr oft kommt es vor, dass ein bestimmtes Element aus einer Sammlung entfernt werden muss. Der Code sieht ungefähr so ​​aus:

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

Dieser Code funktioniert nicht, da Sie eine for-each-Schleife nicht verwenden können, um gleichzeitig die Elemente einer Sammlung zu durchlaufen und diese Sammlung zu ändern.

Es gibt mehrere Lösungen. Zunächst können Sie eine Sammlung durchlaufen und eine andere ändern:

Lösung 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);

Zweitens verfügen Sammlungen seit Java 8 über eine removeIf()Methode, an die Sie eine Regel (Lambda-Funktion) übergeben können, die angibt, welche Elemente entfernt werden sollen.

Beispiel:

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

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


6. Platzieren mehrerer Klassen mit dem publicModifikator in einer einzigen Datei

Eine Datei kann nur eine öffentliche Klasse enthalten. In einer Datei können weitere Klassen deklariert werden, diese müssen jedoch entweder innere Klassen einer öffentlichen Klasse sein oder nicht über den publicModifikator verfügen. Beispiel:

Inhalt der Solution.java-Datei Notiz
public class Solution
{
}
public class Main
{
}
Dies ist nicht zulässig: zwei öffentliche Klassen in einer einzigen Datei.
public class Solution
{
}
class Main
{
}
Aber Sie können dies tun. Die Main-Klasse ist nicht öffentlich
public class Solution
{
  public static class Main
  {
  }
}
Und Sie können dies tun. Die Hauptklasse ist eine verschachtelte Klasse


7. Aufrufen gewöhnlicher (nicht statischer) Methoden einer Klasse aus der statischen main()Methode

Manchmal versuchen Programmieranfänger, über die main()Methode oder andere statische Methoden auf nicht statische Variablen und Methoden zuzugreifen. Ein solcher Code wird natürlich nicht funktionieren.

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

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

Die Hauptmethode kann nur auf statische Methoden/Variablen verweisen. Nun ja, oder es muss zuerst eine Instanz der SolutionKlasse erstellen und erst dann nicht-statische Methoden dieses Objekts aufrufen. Beispiel:

Lösung 1 Lösung 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. Einen Konstruktor wie eine Methode deklarieren

Ein weiterer häufiger Fehler ist die falsche Deklaration eines Klassenkonstruktors. Der Name eines Konstruktors muss mit dem Namen der Klasse identisch sein und ein Konstruktor hat keinen Ergebnistyp. Die häufigsten Fehler sehen so aus:

public class Person
{
   private String value;

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




Hier sollte kein Rückgabetyp vorhanden sein
public class Person
{
   private String value;

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




Ungültiger Konstruktorname. Der Name des Konstruktors muss mit dem Klassennamen übereinstimmen
public class Person
{
   private String value;

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






this wird vermisst. Die valueVariable wird sich selbst zugewiesen
public class Person
{
   private String value;

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




Das ist alles richtig


9. Falsche Vererbung von Schnittstellen

Die Erfinder von Java versuchten, es dem Englischen sehr anzunähern, und wählten daher unterschiedliche Schlüsselwörter für bestimmte verwandte Konzepte.

Wenn eine Klasse eine Klasse erbt, müssen Sie das extendsSchlüsselwort verwenden:

class Pet
{
}

class Cat extends Pet
{
}

implementsWenn eine Klasse eine Schnittstelle erbt, müssen Sie das Schlüsselwort verwenden :

interface Meow
{
}

class Cat implements Meow
{
}

Wenn eine Schnittstelle eine Schnittstelle erbt, verwenden Sie das extendsSchlüsselwort:

interface Meow
{
}

interface Voice extends Meow
{
}


10. Weglassen breakin einer switchAussage

Und der letzte Fehler für uns heute, aber nicht der letzte für Anfänger, besteht darin, eine breakAussage nicht in eine switchAussage aufzunehmen. Beispiel

Falsch 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;
}