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 if
Anweisung 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");
}
String
2. Ein Objekt ändern
Neue Programmierer vergessen oft, dass alle Objekte der Klasse unveränderlich sind und dass jede Methode der String
Klasse 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
, i
usw. Das ist grausam, wenn der Code mehrere Variablen wie diese enthält:
Tragen Sie die Zahl 99 in 100 Zellen eines Arrays ein |
---|
|
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 |
---|
|
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 |
---|
|
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 |
---|
|
6. Platzieren mehrerer Klassen mit dem public
Modifikator 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 public
Modifikator verfügen. Beispiel:
Inhalt der Solution.java-Datei | Notiz |
---|---|
|
Dies ist nicht zulässig: zwei öffentliche Klassen in einer einzigen Datei. |
|
Aber Sie können dies tun. Die Main-Klasse ist nicht öffentlich |
|
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 Solution
Klasse erstellen und erst dann nicht-statische Methoden dieses Objekts aufrufen. Beispiel:
Lösung 1 | Lösung 2 |
---|---|
|
|
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:
|
Hier sollte kein Rückgabetyp vorhanden sein |
|
Ungültiger Konstruktorname. Der Name des Konstruktors muss mit dem Klassennamen übereinstimmen |
|
this wird vermisst. Die value Variable wird sich selbst zugewiesen |
|
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 extends
Schlüsselwort verwenden:
class Pet
{
}
class Cat extends Pet
{
}
implements
Wenn 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 extends
Schlüsselwort:
interface Meow
{
}
interface Voice extends Meow
{
}
10. Weglassen break
in einer switch
Aussage
Und der letzte Fehler für uns heute, aber nicht der letzte für Anfänger, besteht darin, eine break
Aussage nicht in eine switch
Aussage aufzunehmen. Beispiel
Falsch | Rechts |
---|---|
|
|
GO TO FULL VERSION