JavaRush /จาวาบล็อก /Random-TH /8 ข้อผิดพลาดทั่วไปของโปรแกรมเมอร์มือใหม่

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

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

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

    การอ้างอิงชี้ไปยังที่อยู่ในหน่วยความจำ และหากที่อยู่ต่างกัน การเปรียบเทียบ==จะส่งกลับ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);
       }
    }

    เพื่อเปรียบเทียบวัตถุในชั้นเรียนObjectมีวิธีพิเศษ - equals(). การใช้งานเริ่มต้นพูดอย่างตรงไปตรงมาคือพอใช้ได้:

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

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

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

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

    หากคุณเคยเห็นคำจารึกว่า “ ตัวแปรที่ไม่คงที่ x ไม่สามารถอ้างอิงได้จากบริบทแบบคงที่ ” - ยินดีต้อนรับสู่สโมสร :)

    วิธีการแบบคงที่ไม่สามารถเข้าถึงตัวแปรคลาสที่ไม่คงที่

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

    ในทางตรงกันข้าม เป็นไปได้:อนุญาตให้ใช้ตัวแปรคงที่ในวิธีที่ไม่คงที่ได้:

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

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

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

    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. ละเลยกฎการเขียนโค้ด

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

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

    Ведь 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 ข้อผิดพลาดทั่วไปของโปรแกรมเมอร์มือใหม่ - 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 в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)

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