CodeGym /Blog Java /Ngẫu nhiên /8 sai lầm phổ biến của các lập trình viên tân binh

8 sai lầm phổ biến của các lập trình viên tân binh

Xuất bản trong nhóm
CHÀO! Hôm nay chúng ta sẽ xem xét 8 lỗi rất phổ biến của các nhà phát triển Java tân binh (và những người khác). Bạn sẽ tìm thấy nhiều danh sách như vậy trên web: nhiều danh sách tương tự nhau. Khi chúng tôi biên soạn danh sách của mình, chúng tôi đã được hướng dẫn bởi một tiêu chí: liệu chúng tôi có phạm sai lầm trong quá trình học tập hay làm việc hay không :) Chúng không được sắp xếp theo mức độ quan trọng — chúng đều quan trọng như nhau để bạn hiểu và ghi nhớ.
  1. So sánh các đối tượng sử dụng == .

    Toán tử == so sánh các tham chiếu đối tượng.

    Tham chiếu trỏ đến địa chỉ trong bộ nhớ. Nếu chúng được lưu trữ ở các địa chỉ khác nhau thì so sánh bằng == sẽ trả về 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);
        }
    }
    

    Để so sánh các đối tượng, lớp Object có một phương thức đặc biệt: equals() . Thành thật mà nói, việc triển khai mặc định của nó không tệ:

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

    Trong chính lớp Đối tượng , phương thức equals() được triển khai để so sánh hai tham chiếu. Đổi lại, để so sánh chính xác các đối tượng, bạn cần xác định lại phương pháp này theo các tiêu chí có liên quan trong chương trình cụ thể của bạn cho các đối tượng cụ thể của bạn. Các tiêu chí cho sự bình đẳng là tùy thuộc vào bạn.

    Điều duy nhất bạn không được quên là danh sách các yêu cầu để ghi đè đúng cách equals() . Bạn có thể dễ dàng tìm thấy chúng trên Internet.

  2. Sử dụng các biến không tĩnh trong các phương thức tĩnh (và ngược lại).

    Nếu bạn đã từng thấy thông báo "Biến không tĩnh x không thể được tham chiếu từ ngữ cảnh tĩnh", chào mừng bạn đến với câu lạc bộ :)

    Các phương thức tĩnh không có quyền truy cập vào các biến (thể hiện) không tĩnh.

    Điều này có ý nghĩa: xét cho cùng, một phương thức tĩnh có thể được gọi mà không cần tạo một đối tượng của lớp của nó và tất cả các trường thuộc về các đối tượng cụ thể. Và đây là mâu thuẫn gây ra lỗi.

    Nhân tiện, đi theo cách khác hoạt động tốt: bạn có thể sử dụng các biến tĩnh trong các phương thức không tĩnh:

    
    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. Hiểu sai cách truyền đối số cho phương thức: theo tham chiếu hoặc theo giá trị.

    Các đối tượng và nguyên hàm được truyền cho các phương thức theo hai cách khác nhau: thứ nhất, bằng cách tham chiếu; thứ hai, theo giá trị.

    Những người mới bắt đầu thường cảm thấy khó hiểu khái niệm này. Kết quả là mã của họ hoạt động không mong muốn:

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

    Nếu bạn không biết chính xác con số nào sẽ tăng và con số nào sẽ không (số cũ hoặc tuổi của con mèo), thì hãy đọc lại bài học của chúng tôi về chủ đề này .

  4. Bỏ qua các quy tắc mã hóa.

    Điều này không chỉ áp dụng cho việc tuân thủ các nguyên tắc "kỹ thuật" nhất định mà còn cho các quy ước đặt tên thông thường.

    Tất cả các quy tắc này (cách đặt tên biến, cách viết tên phương thức) được phát minh ra đều có lý do. Chúng thực sự ảnh hưởng đến khả năng đọc mã

    Rốt cuộc, mã không phải lúc nào cũng là của riêng bạn. Bạn có thể được chuyển sang một dự án khác tại công ty của bạn. Đồng nghiệp của bạn, những người kế thừa mã của bạn, rõ ràng sẽ không hài lòng khi họ nhìn thấy những thứ như thế này:

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

    Mã của bạn có thể có hiệu suất cao một cách khéo léo, nhưng nếu không thể đọc và hiểu nó thực sự hoạt động như thế nào, thì than ôi, nó chẳng có giá trị gì nhiều.

    Nếu bạn tuân thủ các tiêu chuẩn mã hóa, thì ngay cả khi mã của bạn không lý tưởng, thì ít nhất các đồng nghiệp có kinh nghiệm hơn của bạn sẽ có thể cho bạn biết cách cải thiện mã đó từ quan điểm kỹ thuật :)

  5. Hiểu sai lớp 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);
        }
    }
    

    Nếu bạn không biết tại sao mã này hiển thị sai , rõ ràng là bạn cần nâng cao kiến ​​thức của mình :)

    Những người mới bắt đầu thường không biết về String Pool và cách thức hoạt động của nó.

    Kết quả là, họ hoàn toàn không hiểu cách so sánh đúng các chuỗi trong mã của họ. Chúng tôi đã khám phá chủ đề này một cách chi tiết trong một trong những bài học của chúng tôi .

  6. Xử lý ngoại lệ không chính xác.

    Người mới bắt đầu không phải là những người duy nhất vấp phải điều này. Các nhà phát triển có kinh nghiệm cũng bị vấp. Có rất nhiều lý do.

    Đầu tiên, không có công thức chung. Các chương trình có đủ loại lỗi khác nhau và các tình huống xử lý lỗi khác nhau.

    Thứ hai, không phải ai cũng hiểu cách cấu trúc theo dõi ngăn xếp . Có rất nhiều lỗi khi xử lý các phản mẫu và mỗi lỗi trong số chúng đều "sai" theo cách riêng của nó. Điều này có nghĩa là việc xử lý lỗi sai dễ dàng hơn rất nhiều so với bất kỳ điều gì khác.

  7. Không hiểu đầy đủ về cách thức hoạt động của các toán tử (số học, logic và những thứ khác).

    8 lỗi lập trình viên mới vào nghề thường mắc phải - 2

    Đây là một ví dụ đơn giản. Bạn có thể nói ngay đoạn mã này sẽ hiển thị gì không?

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

    Nếu bạn trả lời sai hoặc chỉ đoán, thì bạn vẫn còn lỗ hổng kiến ​​thức trong lĩnh vực này :)

    Mã này sẽ hiển thị false , vì toán tử đẳng thức ( == ) có mức độ ưu tiên cao hơn toán tử gia số hậu tố ( ++ ). Do đó, phép so sánh 7 == i được loại bỏ trước và chỉ sau đó thao tác i++ mới được thực hiện.

    Nhân tiện, chúng tôi cũng đã có một bài học chi tiết về điều này. Đây là liên kết nếu bạn bỏ lỡ nó.

  8. Bỏ qua từ ngắt trong câu lệnh chuyển đổi .

    Nhiều người đọc bài viết này chắc chắn đã mắc phải sai lầm này! :)

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

    Kết quả là, quá trình thực thi bị xáo trộn qua mọi tùy chọn có thể:

    Đầu ra:

    Số bằng 1 Số bằng 2 Số bằng 3

    Câu lệnh break làm gián đoạn việc thực thi câu lệnh switch khi một trong các tùy chọn được thực hiện xong. Đừng quên nó hoặc bạn có thể nhận được kết quả không mong muốn :)

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION