CodeGym /Blog Java /rawak /8 kesilapan biasa yang dilakukan oleh pengaturcara baru
John Squirrels
Tahap
San Francisco

8 kesilapan biasa yang dilakukan oleh pengaturcara baru

Diterbitkan dalam kumpulan
Hai! Hari ini kita akan melihat 8 kesilapan yang biasa dilakukan oleh pemaju Java baru (dan lain-lain). Anda akan menemui banyak senarai sedemikian di web: kebanyakannya adalah serupa antara satu sama lain. Semasa kami menyusun senarai kami, kami dipandu oleh satu kriteria: sama ada kami sendiri yang membuat kesilapan semasa pengajian atau pekerjaan :) Mereka tidak disusun mengikut kepentingan — ia sama penting untuk anda fahami dan ingat.
  1. Membandingkan objek menggunakan == .

    Operator == membandingkan rujukan objek.

    Rujukan menunjuk kepada alamat dalam ingatan. Jika ia disimpan di alamat yang berbeza, maka perbandingan menggunakan == akan mengembalikan false .

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

    Untuk membandingkan objek, kelas Objek mempunyai kaedah khas: equals() . Terus terang, pelaksanaan lalainya tidak buruk:

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

    Dalam kelas Objek itu sendiri, kaedah equals() dilaksanakan sebagai perbandingan dua rujukan. Sebaliknya, untuk membandingkan objek dengan betul, anda perlu mentakrifkan semula kaedah ini mengikut kriteria yang berkaitan dalam program khusus anda untuk objek tertentu anda. Kriteria untuk kesaksamaan terpulang kepada anda.

    Satu-satunya perkara yang anda tidak boleh lupa ialah senarai keperluan untuk mengatasi dengan betul equals() . Anda boleh mencarinya dengan mudah di Internet.

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

    Jika anda pernah melihat mesej "Pembolehubah bukan statik x tidak boleh dirujuk daripada konteks statik", selamat datang ke kelab :)

    Kaedah statik tidak mempunyai akses kepada pembolehubah bukan statik (contoh).

    Ini masuk akal: selepas semua, kaedah statik boleh dipanggil tanpa mencipta objek kelasnya, dan semua medan tergolong dalam objek tertentu. Dan di sinilah terletak percanggahan yang menyebabkan kesilapan.

    Ngomong-ngomong, pergi ke cara lain berfungsi dengan baik: anda boleh 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); // Compilation error - you can't do this!
        }
     
        public void printX() {
     
            System.out.println(staticX); // But you can do this!
        }
    }
    

  3. Salah faham cara hujah dihantar kepada kaedah: melalui rujukan atau nilai.

    Objek dan primitif dihantar kepada kaedah dalam dua cara berbeza: pertama, dengan rujukan; kedua, mengikut nilai.

    Pemula sering merasa sukar untuk memahami konsep ini. Akibatnya, 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 anda tidak tahu dengan tepat nombor mana yang akan meningkat dan yang mana tidak (nombor lama biasa atau umur kucing), maka baca semula pelajaran kami mengenai topik tersebut .

  4. Mengabaikan peraturan pengekodan.

    Ini terpakai bukan sahaja untuk pematuhan dengan prinsip "teknikal" tertentu, tetapi juga kepada konvensyen penamaan biasa.

    Semua peraturan ini (cara menamakan pembolehubah, cara menulis nama kaedah) dicipta atas sebab tertentu. Mereka benar-benar menjejaskan kebolehbacaan kod

    Lagipun, kod itu tidak akan sentiasa menjadi milik anda sahaja. Anda mungkin dipindahkan ke projek lain di syarikat anda. Rakan sekerja anda yang mewarisi kod anda jelas tidak akan gembira apabila mereka melihat sesuatu seperti ini:

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

    Kod anda mungkin mempunyai prestasi yang sangat tinggi, tetapi jika mustahil untuk membaca dan memahami cara ia sebenarnya berfungsi, malangnya, ia tidak bernilai.

    Jika anda berpegang pada piawaian pengekodan, maka walaupun kod anda jauh daripada ideal, sekurang-kurangnya rakan sekerja anda yang lebih berpengalaman akan dapat memberitahu anda cara ia boleh diperbaiki dari sudut teknikal :)

  5. Salah faham kelas String

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

    Jika anda tidak tahu mengapa kod ini memaparkan false , anda pastinya perlu meningkatkan pengetahuan anda :)

    Pemula sering tidak mengetahui tentang Kolam Rentetan dan cara ia berfungsi.

    Akibatnya, mereka tidak memahami sepenuhnya cara membandingkan rentetan dalam kod mereka dengan betul. Kami meneroka topik ini secara terperinci dalam salah satu pelajaran kami .

  6. Mengendalikan pengecualian secara salah.

    Bukan pemula sahaja yang tersandung mengenai perkara ini. Pembangun yang berpengalaman juga tersandung. Sebabnya banyak.

    Pertama, tiada resipi universal. Program mempunyai pelbagai jenis ralat yang berbeza dan senario pengendalian ralat yang berbeza.

    Kedua, tidak semua orang memahami cara surih tindanan distrukturkan. Terdapat banyak ralat pengendalian antipattern, dan setiap daripada mereka adalah "salah" dengan caranya sendiri. Ini bermakna bahawa lebih mudah untuk mendapatkan ralat pengendalian yang salah daripada perkara lain.

  7. Tidak memahami sepenuhnya cara pengendali (aritmetik, logik dan lain-lain) berfungsi.

    8 kesilapan biasa yang dilakukan oleh pengaturcara baru - 2

    Berikut adalah contoh mudah. Bolehkah anda memberitahu dengan segera apa kod ini akan dipaparkan?

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

    Jika anda menjawab salah atau hanya meneka, maka anda masih mempunyai jurang pengetahuan dalam bidang ini :)

    Kod tersebut akan memaparkan palsu , kerana pengendali kesamaan ( == ) mempunyai keutamaan yang lebih tinggi daripada pengendali kenaikan postfix ( ++ ). Oleh itu, perbandingan 7 == i dikeluarkan dahulu, dan barulah operasi i++ dilakukan.

    Dengan cara ini, kami juga mempunyai pelajaran terperinci mengenai perkara ini. Berikut adalah pautan jika anda terlepasnya.

  8. Menggugurkan perkataan putus dalam pernyataan suis .

    Ramai orang yang membaca artikel ini sudah pasti melakukan kesilapan ini! :)

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

    Akibatnya, pelaksanaan jatuh melalui setiap pilihan yang mungkin:

    Pengeluaran:

    Nombornya sama dengan 1 Nombor itu sama dengan 2 Nombor itu sama dengan 3

    Pernyataan putus mengganggu pelaksanaan pernyataan suis apabila salah satu pilihan selesai dilaksanakan. Jangan lupa atau anda mungkin mendapat hasil yang tidak dijangka :)

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