JavaRush /Java-Blog /Random-DE /8 häufige Fehler von unerfahrenen Programmierern

8 häufige Fehler von unerfahrenen Programmierern

Veröffentlicht in der Gruppe Random-DE
Hallo! Heute werfen wir einen Blick auf eine Liste von 8 häufigen Fehlern, die von Anfängern (und nicht nur) Java-Entwicklern gemacht werden. Im Internet finden Sie viele solcher Sammlungen: Viele davon ähneln einander. Bei der Zusammenstellung dieser Liste haben wir uns an einem Kriterium orientiert: ob wir selbst diese Fehler im Studium und Beruf gemacht haben :) Sie haben keine Priorität und sind für das Verstehen und Erinnern gleichermaßen wichtig.
  1. Vergleichen von Objekten mit ==.

    Der Operator ==vergleicht Objektreferenzen.

    Die Referenzen verweisen auf Adressen im Speicher, und wenn sie sich an unterschiedlichen Adressen befinden, ==wird der Vergleich durch Folgendes zurückgeben false.

    public class Car {
    
       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 in einer Klasse zu vergleichen, Objectgibt es eine spezielle Methode – equals(). Die Standardimplementierung ist, ehrlich gesagt, mittelmäßig:

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

    In der Klasse selbst wird Objectdie Logik der Methode equals()als Vergleich zweier Referenzen implementiert. Um Objekte korrekt zu vergleichen, müssen Sie diese Methode wiederum entsprechend den Kriterien neu definieren, die in einem bestimmten Programm für bestimmte Objekte wichtig sind. Die Kriterien für die Gleichstellung legen Sie selbst fest.

    Das Einzige, was Sie nicht vergessen sollten, ist die Liste der Anforderungen für eine ordnungsgemäße Überschreibung equals(). Sie können sie leicht im Internet finden, aber unsere coolen Studenten haben bereits einen Artikel zu diesem Thema verfasst .

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

    Wenn Sie jemals die Aufschrift „ 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 Klassenvariablen.

    Das ist logisch: Schließlich kann eine statische Methode aufgerufen werden, ohne ein Klassenobjekt zu erstellen, und alle Feldvariablen gehören zu bestimmten Objekten. Das ist der Widerspruch, der zum Irrtum führt.

    Im Gegenteil, es ist übrigens möglich: Es ist zulässig, statische Variablen in nicht statischen Methoden zu verwenden:

    public class Main {
    
       public int x = 10;
    
       public static int staticX = 100;
    
       public static void main(String[] args) {
    
           System.out.println(x);//ошибка компиляции, так нельзя!
       }
    
       public void printX() {
    
           System.out.println(staticX);//а так можно!
       }
    }
  3. Missverständnis darüber, wie Parameter an Methoden übergeben werden: per Referenz oder per Wert.

    Objekte und Grundelemente werden auf unterschiedliche Weise als Parameter an Methoden übergeben: Ersteres als Referenz, Letzteres als Wert.

    Für Anfänger ist dieses Konzept oft schwer zu verstehen, was dazu führt, dass sich ihr Code unerwartet verhält:

    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 in diesem Beispiel nicht genau wissen, welche Zahl zunimmt und welche nicht (die übliche Zahl oder das Alter der Katze), dann lesen Sie unseren Vortrag zu diesem Thema noch einmal durch .

  4. Ignorieren der Regeln zum Schreiben von Code.

    Und das gilt nicht nur für die Einhaltung bestimmter „technischer“ Grundsätze, sondern auch für banale Namenskonventionen.

    Alle diese Regeln „ wie man Variablen benennt “ und „ wie man Methodennamen schreibt “ wurden aus einem bestimmten Grund erfunden. Dies beeinträchtigt die Lesbarkeit des Codes erheblich.

    Ведь Code не всегда будет только твоим. Ты можешь перевестись на другой проект в компании, и он перейдет по наследству к твоим коллегам, которые будут явно не в восторге, получив в работу что-то вроде этого:

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

    Твой Code может быть гениальным с точки зрения производительности, но если его невозможно прочитать и понять Wie он, собственно, работает, цена его, увы, невелика.

    Придерживайся стандартов написания, и твой Code, даже далекий от идеала, хотя бы прочтут более опытные товарищи и подскажут, что с технической точки зрения в нем можно улучшить :)

  5. Непонимание работы класса String

    public class Main {
    
       public static void main(String[] args) {
    
           String s1 = "Я изучаю Java";
           String s2 = new String("Я изучаю Java");
    
           System.out.println(s1 == s2);
       }
    }

    Если ты не знаешь, почему этот Code выводит false, знания явно нужно подтянуть:)

    Новички часто не знают что такое String Pool и Wie он работает.

    Как следствие, не до конца ясно, Wie правильно сравнивать строки в своем Codeе. В одной из наших лекций мы подробно рассматривали эту тему

  6. Неправильная работа с исключениями.

    Это свойственно не только новичкам, но и опытным разработчикам. Причин несколько.

    Во-первых, универсального рецепта не существует. Ошибки в программе бывают разные, сценарии их обработки, соответственно, тоже. Во-вторых, не все понимают структуру stackTrace, а антипаттернов обработки ошибок очень много, и каждый из них «неправилен» по-своему. Так что вариантов сделать неправильно здесь намного больше, чем где бы то ни было.

    Распространенные антипаттерны приведены здесь:

  7. Неполное понимание работы операторов (арифметических, логических и других).

    8 häufige Fehler von unerfahrenen Programmierern - 2

    Простой пример. Сможешь сходу сказать, что выведет этот Code?

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

    Если ты ответил неправильно oder наугад, значит, в этой области пока есть пробелы:)

    Код выведет false, потому что приоритет у оператора сравнения == выше, чем у постфиксного инкремента ++. Поэтому сначала будет выполнено сравнение 7 == i, и только потом - операция i++.

    По этой теме, кстати, у нас тоже была подробная лекция. Вот Verknüpfung, если пропустил.

  8. Пропуск слова break в операторе switch.

    Эту ошибку, вероятно, допускали многие из читателей!)

    public class Main {
    
       public static void main(String[] args) {
    
           int i = 1;
    
           switch (i) {
    
               case 1: {
                   System.out.println("Число равно 1");
               }
               case 2: {
                   System.out.println("Число равно 2");
               }
               case 3: {
                   System.out.println("Число равно 3");
               }
           }
       }
    }

    В результате на них обрушивается водопад из всех возможных вариантов:

    Вывод:

    
    Число равно 1
    Число равно 2
    Число равно 3

    Оператор break прерывает работу оператора switch в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)

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