CodeGym /Java-Blog /Random-DE /8 häufige Fehler von unerfahrenen Programmierern
Autor
John Selawsky
Senior Java Developer and Tutor at LearningTree

8 häufige Fehler von unerfahrenen Programmierern

Veröffentlicht in der Gruppe Random-DE
Hallo! Heute werfen wir einen Blick auf 8 sehr häufige Fehler, die von unerfahrenen (und anderen) Java-Entwicklern gemacht werden. Im Internet finden Sie viele solcher Listen, viele davon ähneln einander. Bei der Zusammenstellung unserer Liste haben wir uns an einem Kriterium orientiert: ob wir die Fehler im Studium oder im Berufsleben selbst gemacht haben :) Sie sind nicht nach Wichtigkeit sortiert – sie sind für Sie gleichermaßen wichtig, damit Sie sie verstehen und im Gedächtnis behalten.
  1. Vergleichen von Objekten mit == .

    Der ==- Operator vergleicht Objektreferenzen.

    Referenzen verweisen auf Adressen im Speicher. Wenn sie an unterschiedlichen Adressen gespeichert sind, wird beim Vergleich mit == false zurückgegeben .

    
    public class Vehicle {
     
        String model;
        int maxSpeed;
        int yearOfManufacture;
     
        public Car(String model, int maxSpeed, int yearOfManufacture) {
            this.model = model;
            this.maxSpeed = maxSpeed;
            this.yearOfManufacture = yearOfManufacture;
        }
     
        public static void main(String[] args) {
            Car ferrari = new Car("Ferrari 360 Spider", 280, 1996);
            Car ferrariTwin = new Car("Ferrari 360 Spider", 280, 1996);
            System.out.println(ferrari == ferrariTwin);
        }
    }
    

    Um Objekte zu vergleichen, verfügt die Object- Klasse über eine spezielle Methode: equal() . Ehrlich gesagt ist die Standardimplementierung nicht schlecht:

    
    public boolean equals(Object obj) {
        return (this == obj);
    }
    

    In der Object- Klasse selbst ist die Methode equal() als Vergleich zweier Referenzen implementiert. Um wiederum Objekte korrekt zu vergleichen, müssen Sie diese Methode entsprechend den Kriterien neu definieren, die in Ihrem speziellen Programm für Ihre speziellen Objekte relevant sind. Die Kriterien für die Gleichstellung liegen bei Ihnen.

    Das Einzige, was Sie nicht vergessen dürfen, ist die Liste der Anforderungen für das ordnungsgemäße Überschreiben von equal() . Sie können sie leicht im Internet finden.

  2. Verwendung nicht statischer Variablen in statischen Methoden (und umgekehrt).

    Wenn Sie jemals die Meldung „Die nicht statische Variable x kann nicht aus einem statischen Kontext referenziert werden“ gesehen haben, willkommen im Club :)

    Statische Methoden haben keinen Zugriff auf nicht statische (Instanz-)Variablen.

    Das macht Sinn: Schließlich kann eine statische Methode aufgerufen werden, ohne ein Objekt ihrer Klasse zu erstellen, und alle Felder gehören zu bestimmten Objekten. Und hierin liegt der Widerspruch, der den Fehler verursacht.

    Der umgekehrte Weg funktioniert übrigens auch gut: Sie können statische Variablen in nicht statischen Methoden verwenden:

    
    public class Main {
     
        public int x = 10;
     
        public static int staticX = 100;
     
        public static void main(String[] args) {
     
            System.out.println(x); // Compilation error - you can't do this!
        }
     
        public void printX() {
     
            System.out.println(staticX); // But you can do this!
        }
    }
    

  3. Missverständnis, wie Argumente an Methoden übergeben werden: als Referenz oder als Wert.

    Objekte und Grundelemente werden auf zwei verschiedene Arten an Methoden übergeben: erstens durch Referenz; zweitens nach Wert.

    Anfängern fällt es oft schwer, dieses Konzept zu verstehen. Infolgedessen verhält sich ihr Code unerwartet:

    
    public class Main {
     
        public static void main(String[] args) {
     
            int x = 7;
            incrementNumber(x);
            System.out.println(x);
     
            Cat cat = new Cat(7);
            catLevelUp(cat);
            System.out.println(cat.getAge());
     
        }
     
        public static void catLevelUp(Cat cat) {
     
            cat.setAge(cat.getAge()+1);
        }
     
        public static void incrementNumber(int x) {
            x++;
        }
    }
    

    Wenn Sie nicht genau wissen, welche Zahl zunimmt und welche nicht (die alte Zahl oder das Alter der Katze), dann lesen Sie unsere Lektion zu diesem Thema noch einmal .

  4. Codierungsregeln ignorieren.

    Dies gilt nicht nur für die Einhaltung bestimmter „technischer“ Grundsätze, sondern auch für alltägliche Namenskonventionen.

    Alle diese Regeln (wie man Variablen benennt, wie man Methodennamen schreibt) wurden aus einem bestimmten Grund erfunden. Sie wirken sich erheblich auf die Lesbarkeit des Codes aus

    Schließlich gehört der Code nicht immer nur Ihnen. Möglicherweise werden Sie in ein anderes Projekt in Ihrem Unternehmen versetzt. Ihre Kollegen, die Ihren Code geerbt haben, werden offensichtlich nicht erfreut sein, wenn sie so etwas sehen:

    
    public class Cat {
     
        private int S_O_M_E_T_H_I_N_G = 7;
        public String striiiiiiiiiiiiiing;
        protected double I_HAVE_NO_IDEA_WHAT_THIS_IS = 3.14;
        boolean random = Math.random() > 0.5;
     
    }
    

    Ihr Code mag eine genial hohe Leistung haben, aber wenn es unmöglich ist, zu lesen und zu verstehen, wie er tatsächlich funktioniert, dann ist er leider nicht viel wert.

    Wenn Sie sich an Codierungsstandards halten, können Ihnen zumindest Ihre erfahreneren Kollegen sagen, wie er aus technischer Sicht verbessert werden kann, auch wenn Ihr Code alles andere als ideal ist :)

  5. Missverständnis der String- Klasse

    
    public class Main {
     
        public static void main(String[] args) {
     
            String s1 = "I'm learning Java";
            String s2 = new String("I'm learning Java");
     
            System.out.println(s1 == s2);
        }
    }
    

    Wenn Sie nicht wissen, warum dieser Code false anzeigt , müssen Sie Ihr Wissen natürlich vertiefen :)

    Anfänger kennen den String Pool und seine Funktionsweise oft nicht.

    Daher verstehen sie nicht ganz, wie sie Zeichenfolgen in ihrem Code richtig vergleichen. Wir haben dieses Thema in einer unserer Lektionen ausführlich behandelt .

  6. Ausnahmen falsch behandeln.

    Anfänger sind nicht die einzigen, die darüber stolpern. Auch erfahrene Entwickler geraten ins Stolpern. Die Gründe sind vielfältig.

    Erstens gibt es kein universelles Rezept. Programme haben alle möglichen Fehler und unterschiedliche Fehlerbehandlungsszenarien.

    Zweitens versteht nicht jeder, wie ein Stack-Trace aufgebaut ist. Es gibt viele Antipatterns zur Fehlerbehandlung, und jedes davon ist auf seine Art „falsch“. Das bedeutet, dass es viel einfacher ist, bei der Fehlerbehandlung Fehler zu machen als bei so ziemlich allem anderen.

  7. Ich verstehe nicht vollständig, wie Operatoren (arithmetische, logische und andere) funktionieren.

    8 häufige Fehler von unerfahrenen Programmierern - 2

    Hier ist ein einfaches Beispiel. Können Sie sofort erkennen, was dieser Code anzeigen wird?

    
    public class Main {
     
        public static void main(String[] args) {
     
            int i = 6;
            System.out.println(7 == i++);
        }
    }
    

    Wenn Sie falsch geantwortet haben oder nur geraten haben, dann haben Sie in diesem Bereich noch Wissenslücken :)

    Der Code zeigt false an , da der Gleichheitsoperator ( == ) eine höhere Priorität hat als der Postfix-Inkrementoperator ( ++ ). Daher wird zuerst der 7 == i -Vergleich ausgeführt und erst dann die i++- Operation ausgeführt.

    Hierzu hatten wir übrigens auch eine ausführliche Lektion. Hier ist der Link , falls Sie ihn verpasst haben.

  8. Das Wort „Break“ in einer Switch- Anweisung weglassen .

    Viele Leute, die diesen Artikel lesen, haben diesen Fehler sicherlich gemacht! :) :)

    
    public class Main {
     
        public static void main(String[] args) {
     
            int i = 1;
     
            switch (i) {
     
                case 1: {
                    System.out.println("The number is equal to 1");
                }
                case 2: {
                    System.out.println("The number is equal to 2");
                }
                case 3: {
                    System.out.println("The number is equal to 3");
                }
            }
        }
     }
    

    Infolgedessen durchläuft die Ausführung alle möglichen Optionen:

    Ausgang:

    Die Zahl ist gleich 1. Die Zahl ist gleich 2. Die Zahl ist gleich 3

    Eine Break- Anweisung unterbricht die Ausführung der Switch- Anweisung, wenn die Ausführung einer der Optionen abgeschlossen ist. Vergessen Sie es nicht, sonst erhalten Sie möglicherweise unerwartete Ergebnisse :)

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION