JavaRush /Blog Java /Random-MS /8 kesilapan biasa pengaturcara baru

8 kesilapan biasa pengaturcara baru

Diterbitkan dalam kumpulan
hello! Hari ini kita akan melihat senarai 8 kesilapan biasa yang dilakukan oleh permulaan (dan bukan sahaja) pembangun Java. Anda akan menemui banyak koleksi sedemikian di Internet: kebanyakannya adalah serupa antara satu sama lain. Apabila kami menyusun senarai ini, kami dipandu oleh satu kriteria: sama ada kami sendiri melakukan kesilapan ini semasa belajar dan bekerja :) Mereka tidak diutamakan dan sama pentingnya untuk memahami dan mengingati.
  1. Membanding objek menggunakan ==.

    Operator ==membandingkan rujukan objek.

    Rujukan menghala ke alamat dalam ingatan, dan jika ia berada di alamat yang berbeza, perbandingan melalui ==akan kembali 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);
       }
    }

    Untuk membandingkan objek dalam kelas Objectterdapat kaedah khas - equals(). Pelaksanaan lalainya, terus terang, adalah begitu-begitu:

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

    Dalam kelas itu sendiri, Objectlogik kaedah equals()dilaksanakan sebagai perbandingan dua rujukan. Sebaliknya, untuk membandingkan objek dengan betul, anda perlu mentakrifkan semula kaedah ini mengikut kriteria yang penting dalam program khusus untuk objek tertentu. Anda sendiri yang menentukan kriteria kesamarataan.

    Satu-satunya perkara yang anda tidak boleh lupa ialah senarai keperluan untuk penggantian yang betul equals(). Anda boleh mencarinya dengan mudah di Internet, tetapi pelajar kami yang hebat telah pun membuat artikel mengenai topik ini .

  2. Menggunakan pembolehubah bukan statik dalam kaedah statik (dan sebaliknya).

    Jika anda pernah melihat tulisan " Pembolehubah bukan statik x tidak boleh dirujuk dari konteks statik " - selamat datang ke kelab :)

    Kaedah statik tidak mempunyai akses kepada pembolehubah kelas bukan statik.

    Ini adalah logik: selepas semua, kaedah statik boleh dipanggil tanpa mencipta objek kelas, dan semua pembolehubah medan tergolong dalam objek tertentu. Inilah percanggahan yang membawa kepada kesilapan.

    Sebaliknya, dengan cara ini, adalah mungkin: ia dibenarkan menggunakan pembolehubah statik dalam kaedah bukan statik:

    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. Salah faham tentang cara parameter dihantar ke kaedah: dengan rujukan atau nilai.

    Objek dan primitif dihantar ke kaedah sebagai parameter dengan cara yang berbeza: yang pertama dengan rujukan, yang terakhir dengan nilai.

    Pemula sering mendapati konsep ini sukar untuk difahami, menyebabkan kod mereka berkelakuan di luar jangkaan:

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

    Jika dalam contoh ini anda tidak tahu dengan tepat nombor mana yang akan meningkat dan yang mana tidak (nombor biasa atau umur kucing), maka baca semula kuliah kami tentang topik ini sekali lagi .

  4. Mengabaikan peraturan menulis kod.

    Dan ini terpakai bukan sahaja untuk pematuhan dengan prinsip "teknikal" tertentu, tetapi juga untuk konvensyen penamaan cetek.

    Semua peraturan ini " cara menamakan pembolehubah ", " cara menulis nama kaedah " dicipta atas sebab tertentu. Ini sangat mempengaruhi kebolehbacaan kod.

    Ведь 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 может быть гениальным с точки зрения производительности, но если его невозможно прочитать и понять How он, собственно, работает, цена его, увы, невелика.

    Придерживайся стандартов написания, и твой 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 и How он работает.

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

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

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

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

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

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

    8 kesilapan biasa pengaturcara baru - 2

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

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

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

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

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

  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 в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)

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