CodeGym /จาวาบล็อก /สุ่ม /ข้อผิดพลาดทั่วไป 8 ประการของโปรแกรมเมอร์มือใหม่
John Squirrels
ระดับ
San Francisco

ข้อผิดพลาดทั่วไป 8 ประการของโปรแกรมเมอร์มือใหม่

เผยแพร่ในกลุ่ม
สวัสดี! วันนี้เราจะมาดูข้อผิดพลาดทั่วไป 8 ข้อที่เกิดขึ้นโดยนักพัฒนา Java มือใหม่ (และคนอื่นๆ) คุณจะพบรายการดังกล่าวมากมายบนเว็บ หลายรายการมีความคล้ายคลึงกัน เมื่อเรารวบรวมรายการของเรา เราได้รับคำแนะนำจากเกณฑ์เดียว: ไม่ว่าเราจะทำผิดพลาดเองในระหว่างการศึกษาหรือการทำงาน :) เกณฑ์เหล่านี้ไม่ได้ถูกจัดเรียงตามความสำคัญ — เป็นสิ่งสำคัญที่คุณจะต้องเข้าใจและจดจำเท่าๆ กัน
  1. การเปรียบเทียบวัตถุโดยใช้==

    ตัว ดำเนินการ ==เปรียบเทียบการอ้างอิงวัตถุ

    การอ้างอิงชี้ไปยังที่อยู่ในหน่วยความจำ หากเก็บไว้ในที่อยู่ที่แตกต่างกัน การเปรียบเทียบโดยใช้==จะส่งคืนค่าเท็จ

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

    ในการเปรียบเทียบอ็อบเจกต์ คลาส อ็อบเจกต์มีเมธอดพิเศษ: equals( ) การใช้งานเริ่มต้นนั้นไม่เลวเลย:

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

    ใน คลาส อ็อบเจกต์เอง จะใช้เมธอด เท่ากับ ()เพื่อเปรียบเทียบการอ้างอิงสองตัว ในทางกลับกัน เพื่อที่จะเปรียบเทียบวัตถุได้อย่างถูกต้อง คุณต้องกำหนดวิธีการนี้ใหม่ตามเกณฑ์ที่เกี่ยวข้องในโปรแกรมเฉพาะของคุณสำหรับวัตถุเฉพาะของคุณ เกณฑ์ความเท่าเทียมกันขึ้นอยู่กับคุณ

    สิ่งเดียวที่คุณต้องไม่ลืมคือรายการข้อกำหนดสำหรับการเอาชนะเท่ากับ () อย่างถูก ต้อง คุณสามารถค้นหาได้อย่างง่ายดายบนอินเทอร์เน็ต

  2. การใช้ตัวแปรที่ไม่คงที่ในวิธีคงที่ (และในทางกลับกัน)

    หากคุณเคยเห็นข้อความ "ตัวแปรไม่คงที่ x ไม่สามารถอ้างอิงจากบริบทคงที่ได้" ยินดีต้อนรับสู่คลับ :)

    เมธอดสแตติกไม่มีสิทธิ์เข้าถึงตัวแปร (อินสแตนซ์) ที่ไม่ใช่สแตติก

    สิ่งนี้สมเหตุสมผล: ท้ายที่สุดแล้ว สามารถเรียกใช้เมธอดแบบสแตติกได้โดยไม่ต้องสร้างออบเจกต์ของคลาส และฟิลด์ทั้งหมดเป็นของออบเจ็กต์เฉพาะ และนี่คือความขัดแย้งที่ทำให้เกิดข้อผิดพลาด

    อีกอย่าง ใช้วิธีอื่นก็ได้ผลดี: คุณสามารถใช้ตัวแปรสแตติกในวิธีการที่ไม่ใช่สแตติก:

    
    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. ความเข้าใจผิดว่าอาร์กิวเมนต์ถูกส่งผ่านไปยังเมธอดอย่างไร: โดยการอ้างอิงหรือตามค่า

    ออบเจกต์และวัตถุดั้งเดิมถูกส่งผ่านไปยังเมธอดในสองวิธี: วิธีแรกโดยการอ้างอิง ประการที่สองตามมูลค่า

    ผู้เริ่มต้นมักพบว่าเป็นการยากที่จะเข้าใจแนวคิดนี้ เป็นผลให้รหัสทำงานโดยไม่คาดคิด:

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

    หากคุณไม่ทราบแน่ชัดว่าจำนวนใดจะเพิ่มขึ้นและจำนวนใดจะไม่เพิ่มขึ้น (จำนวนเดิมธรรมดาหรืออายุของแมว) ให้อ่านบทเรียนของเราอีกครั้งในหัวข้อ

  4. ละเว้นกฎการเข้ารหัส

    สิ่งนี้ไม่เพียงใช้กับการปฏิบัติตามหลักการ "ทางเทคนิค" บางอย่างเท่านั้น แต่ยังใช้กับแบบแผนการตั้งชื่อทั่วไปด้วย

    กฎทั้งหมดเหล่านี้ (วิธีตั้งชื่อตัวแปร วิธีเขียนชื่อเมธอด) ถูกประดิษฐ์ขึ้นด้วยเหตุผล มันส่งผลต่อความสามารถในการอ่านโค้ดอย่างแท้จริง

    ท้ายที่สุดรหัสจะไม่เป็นของคุณคนเดียวเสมอไป คุณอาจถูกโอนไปยังโครงการอื่นที่บริษัทของคุณ เพื่อนร่วมงานของคุณที่รับรหัสของคุณจะไม่พอใจอย่างเห็นได้ชัดเมื่อพวกเขาเห็นสิ่งนี้:

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

    โค้ดของคุณอาจมีประสิทธิภาพสูงอย่างแยบยล แต่ถ้าไม่สามารถอ่านและเข้าใจว่ามันทำงานจริงได้อย่างไร อนิจจา มันก็ไม่มีค่าอะไรมาก

    หากคุณยึดติดกับมาตรฐานการเขียนโค้ด แม้ว่าโค้ดของคุณจะยังห่างไกลจากอุดมคติ แต่อย่างน้อยเพื่อนร่วมงานที่มีประสบการณ์มากกว่าจะสามารถบอกคุณได้ว่าโค้ดนั้นสามารถปรับปรุงได้อย่างไรจากมุมมองทางเทคนิค :)

  5. ความเข้าใจผิดเกี่ยวกับคลาส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);
        }
    }
    

    หากคุณไม่รู้ว่าเหตุใดรหัสนี้จึงแสดงเป็นเท็จคุณต้องเพิ่มพูนความรู้ของคุณอย่างเห็นได้ชัด :)

    ผู้เริ่มต้นมักจะไม่รู้จักString Poolและวิธีการทำงาน

    เป็นผลให้พวกเขาไม่เข้าใจวิธีการเปรียบเทียบสตริงในโค้ดอย่างถูกต้อง เราได้สำรวจหัวข้อนี้อย่างละเอียดในบทเรียนหนึ่งของเรา

  6. จัดการข้อยกเว้นอย่างไม่ถูกต้อง

    มือใหม่ไม่ใช่คนเดียวที่สะดุดกับสิ่งนี้ นักพัฒนาที่มีประสบการณ์ก็สะดุดเช่นกัน เหตุผลมีมากมาย

    ประการแรกไม่มีสูตรสากล โปรแกรมมีข้อผิดพลาดที่แตกต่างกันทุกประเภทและสถานการณ์การจัดการข้อผิดพลาดที่แตกต่างกัน

    ประการที่สอง ไม่ใช่ทุกคนที่เข้าใจว่าสแต็กเทรซมีโครงสร้าง อย่างไร มีข้อผิดพลาดมากมายในการจัดการกับรูปแบบต่อต้าน และแต่ละข้อก็ "ผิด" ในแบบของตัวเอง ซึ่งหมายความว่าการจัดการข้อผิดพลาดผิดพลาดได้ง่ายกว่าสิ่งอื่นใด

  7. ไม่เข้าใจวิธีการทำงานของตัวดำเนินการ (เลขคณิต ตรรกะ และอื่นๆ) อย่างถ่องแท้

    ข้อผิดพลาดทั่วไป 8 ประการของโปรแกรมเมอร์มือใหม่ - 2

    นี่เป็นตัวอย่างง่ายๆ คุณสามารถบอกได้ทันทีว่ารหัสนี้จะแสดงอะไร?

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

    หากคุณตอบผิดหรือแค่เดา ​​แสดงว่าคุณยังมีช่องว่างความรู้ในด้านนี้ :)

    รหัสจะแสดงเป็นเท็จเนื่องจากตัวดำเนินการความเท่าเทียมกัน ( == ) มีลำดับความสำคัญสูงกว่าตัวดำเนินการเพิ่มค่าหลัง ( ++ ) ดังนั้น การเปรียบเทียบ 7 == iจะถูกดำเนินการก่อน และดำเนินการ i++ เท่านั้น

    อย่างไรก็ตาม เรายังมีบทเรียนโดยละเอียดเกี่ยวกับเรื่องนี้ด้วย นี่คือลิงค์หากคุณพลาด

  8. ละเว้น ตัวแบ่งคำในคำสั่งswitch

    หลายคนที่อ่านบทความนี้ได้ทำผิดพลาดอย่างแน่นอน! :)

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

    ผลที่ตามมาคือ การดำเนินการจะพังทลายผ่านทุกตัวเลือกที่เป็นไปได้:

    เอาท์พุต:

    จำนวนเท่ากับ 1 จำนวนเท่ากับ 2 จำนวนเท่ากับ 3

    คำ สั่ง breakขัดจังหวะการดำเนินการของ คำสั่ง switchเมื่อดำเนินการตัวเลือกใดตัวเลือกหนึ่งเสร็จแล้ว อย่าลืมมิฉะนั้นคุณอาจได้รับผลลัพธ์ที่คาดไม่ถึง :)

ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION